Hibernate5笔记9--Hibernate注解式开发

Hibernate注解式开发:

  (1)注解式开发的注意点:

    Hibernate中使用注解,主要是为了替代映射文件,完成“类到表,属性到字段”的映射。 
    JPA提供了一套功能强大的注解。Hibernate直接使用了JPA的这套注解。当然,对于JPA中的一些不足,Hibernate又开发了一些自己的注解。这些注解要么继承自JPA,要么是独立的注解,作为JPA的补充。 
    故,我们使用的注解,基本是javax.persistence.Transient包中的。 使用注解时需注意以下几点: 
      (1)使用的均为javax.persistence.Transient包中的注解  

      (2)不再需要映射文件了 

      (3)在Hibernate主配置文件中无需指定映射文件了,但需要指定注解的实体类。

  (2)示例一(基本注解):

 1 @Entity   //表明当前类为实体类
 2 @Table(name="t_student")  //可以省略
 3 public class Student {
 4     @Id
 5     @GeneratedValue(strategy=GenerationType.IDENTITY)  //表明主键值由数据库自己来维护
 6     private Integer id; 
 7     @Basic   //表明当前属性将被持久化导数据库中,该注解为属性的默认注解,可以省略
 8     @Column(name="tname")
 9     private String name;
10     @Basic   //表明当前属性将被持久化导数据库中,该注解为属性的默认注解
11     @Column(name="tage")
12     private int age;
13     @Transient  //表明当前属性将不写到数据库中 
14     private double score;

   示例二(使用Hibernate内置主键生成策略):

 1 @Entity   
 2 public class Student {
 3     @Id
 4     @GeneratedValue(generator="xxx")  //使用自己定义的主键生成器
 5     @GenericGenerator(name="xxx", strategy="native")  //生成一个主键生成器,目的是为了使用Hibernate自带的主键生成策略
 6     private Integer id; 
 7     private String name;
 8     private int age;
 9     @Transient  //表明当前属性将不写到数据库中 
10     private double score;

   示例三(一对多双向关联,并且一方放弃关联关系维护权):

 1 @Entity
 2 public class Country {
 3     @Id
 4     @GeneratedValue(strategy=GenerationType.IDENTITY)
 5     private Integer cid;
 6     private String cname;
 7     
 8     //mappedBy="country" 表示一方放弃维护权,并将维护权交给了对方的关联属性country
 9     @OneToMany(targetEntity=Minister.class, cascade=CascadeType.ALL, mappedBy="country")  //targetEntity可以省略
10     //一旦一方放弃了维护权,则@JoinColumn注解将不能使用
11     //@JoinColumn(name="countryId")
12     private Set<Minister> ministers;
 1 @Entity
 2 public class Minister {
 3     @Id
 4     @GeneratedValue(strategy=GenerationType.IDENTITY)  
 5     private Integer mid;
 6     private String mname;
 7     
 8     @ManyToOne(targetEntity=Country.class, cascade=CascadeType.ALL)  //注意:这里只能使用ALL,因为注解是JPA的注解,如果不用ALL,就对Hibernate的代码不起作用
 9     @JoinColumn(name="countryId")
10     private Country country;  //关联属性

   示例四(自关联):

 1 @Entity
 2 //新闻栏目
 3 public class NewsLabel {
 4     @Id
 5     @GeneratedValue(strategy=GenerationType.IDENTITY)
 6     private Integer id;
 7     private String name;  //栏目名称
 8     private String content;  //栏目内容
 9     
10     @ManyToOne(cascade=CascadeType.ALL)
11     @JoinColumn(name="pid")
12     private NewsLabel parentNewsLabel;  //父栏目
13 
14     @OneToMany(cascade=CascadeType.ALL)
15     @JoinColumn(name="pid")
16     private Set<NewsLabel> childNewsLabels;  //子栏目

   示例五(多对多双向关联,代码更简单,无需指定中间表,因为底层实现了很多):

 1 @Entity
 2 public class Course {
 3     @Id
 4     @GeneratedValue(strategy=GenerationType.IDENTITY)
 5     private Integer cid;
 6     private String cname;
 7     
 8     //多对多双向关联的注解,要求有一方要放弃维护权。否则,将要生成两张中间表,当然只有一张中间表起作用
 9     @ManyToMany(cascade=CascadeType.ALL, mappedBy="courses")
10     private Set<Student> students;
1 @Entity
2 public class Student {
3     @Id
4     @GeneratedValue(strategy=GenerationType.IDENTITY)
5     private Integer sid;
6     private String sname;
7     
8     @ManyToMany(cascade=CascadeType.ALL)
9     private Set<Course> courses;

   示例六(二级缓存,Query缓存不能使用注解):

 1 @Entity
 2 @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
 3 public class Country {
 4     @Id
 5     @GeneratedValue(strategy=GenerationType.IDENTITY)
 6     private Integer cid;
 7     private String cname;
 8     
 9     @OneToMany(cascade=CascadeType.ALL)
10     @JoinColumn(name="countryId")
11     @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
12     private Set<Minister> ministers;
 1 @Entity
 2 @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
 3 public class Minister {
 4     @Id
 5     @GeneratedValue(strategy=GenerationType.IDENTITY)
 6     private Integer mid;
 7     private String mname;
 8     
 9     @ManyToOne(cascade=CascadeType.ALL)
10     @JoinColumn(name="countryId")
11     private Country country;  //关联属性
posted @ 2017-01-19 15:16  拉夫德尔  阅读(791)  评论(0编辑  收藏  举报