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; //关联属性