Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射。在Hibernate3.3之前,需单独下载注解开发包
配置持久化类
配置关联关系
下面我们先从多对一单向关联关系讲起,多对一单向关联就是在多的一方植入一的一方的主键作为外键,下面我们先进行初始配置,
在配置的过程中我们会遇到一个问题 就是无论用load还是get都不会出现延迟加载,那么我们应该如何设置为要延迟加载,这样做的好处是可以在用的时候才加载对应的信息,节约内存
hibernate中,延迟加载大致可以分为两类,一类是延迟属性加载,另一类是延迟关联实体加载。
普通属性:分两种情况,一种是集合属性,一种是非集合属性(如String、Integer......)
集合属性的延迟加载通过PersistentSet、 PersistentList、PersistentBag、PersistentMap、PersistentSortedMap、 PersistentSortedSet作为代理类来实现,代理类中保存了session以及owner属性,owner属性表示了集合属性所属的one 侧的实体。
非集合类属性的延迟加载相对比较复杂。仅通过@Basic(fetch = FetchType.LAZY)注解是无法实现延迟加载的。需要让实体实现FieldHandled接口,声明FieldHandler属性,通过拦截器 原理注入对应的FieldHandler属性,起到类似于上述代理类的作用,FieldHandler同样也保持了session,以及需要延迟加载的属 性。
我们发现对非集合属性即时设置了@Basic(fetch = FetchType.LAZY)仍无法实现延迟加载,可以看生成的sql语句
接下来 我们会对一对多单向关联进行测试,验证对集合类属性,是否可以起到延迟加载的功能
注意:不可以对有关联关系的属性设置@Transient
配置多对一的单向关联关系 示例
1 package cn.happy.entity; 2 3 import javax.persistence.Basic; 4 import javax.persistence.Column; 5 import javax.persistence.Entity; 6 import javax.persistence.FetchType; 7 import javax.persistence.GeneratedValue; 8 import javax.persistence.GenerationType; 9 import javax.persistence.Id; 10 import javax.persistence.JoinColumn; 11 import javax.persistence.ManyToOne; 12 import javax.persistence.SequenceGenerator; 13 import javax.persistence.Table; 14 import javax.persistence.Transient; 15 16 @Entity 17 @Table(name = "EMP") 18 public class Emp { 19 @Id 20 @Column(name = "EMPNO") 21 @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "emp_num") 22 @SequenceGenerator(name = "emp_num", sequenceName = "emp_num_id", allocationSize = 1, initialValue = 1) 23 private Integer empNo; 24 25 @Column(name = "EMPNAME") 26 private String empName; 27 28 @ManyToOne() 29 @JoinColumn(name = "DEPTNO") 30 /*@Basic(fetch=FetchType.LAZY)*/ 31 private Dept dept; 32 33 34 public Emp() { 35 super(); 36 } 37 38 public Emp(Integer empNo, String empName) { 39 super(); 40 this.empNo = empNo; 41 this.empName = empName; 42 } 43 44 public Integer getEmpNo() { 45 return empNo; 46 } 47 48 public void setEmpNo(Integer empNo) { 49 this.empNo = empNo; 50 } 51 52 public String getEmpName() { 53 return empName; 54 } 55 56 public void setEmpName(String empName) { 57 this.empName = empName; 58 } 59 60 public Dept getDept() { 61 return dept; 62 } 63 64 public void setDept(Dept dept) { 65 this.dept = dept; 66 } 67 }