Hibernate中用註解配置一對多雙向關聯和多對一單向關聯

 

                                                                 Hibernate中用註解配置一對多雙向關聯和多對一單向關聯java

 

 Hibernate提供了Hibernate Annotations擴展包,使用註解完成映射。Hibernate3.3以前,需單獨下載註解開發包sql

 

配置持久化類session

配置關聯關係app

 下面咱們先從多對一單向關聯關係講起,多對一單向關聯就是在多的一方植入一的一方的主鍵做爲外鍵,下面咱們先進行初始配置,測試

 

在配置的過程當中咱們會遇到一個問題  就是不管用load仍是get都不會出現延遲加載,那麼咱們應該如何設置爲要延遲加載,這樣作的好處是能夠在用的時候才加載對應的信息,節約內存fetch

 

hibernate中,延遲加載大體能夠分爲兩類,一類是延遲屬性加載,另外一類是延遲關聯實體加載。ui

 

普通屬性:分兩種狀況,一種是集合屬性,一種是非集合屬性(如String、Integer......)this

集合屬性的延遲加載經過PersistentSet、 PersistentList、PersistentBag、PersistentMap、PersistentSortedMap、 PersistentSortedSet做爲代理類來實現,代理類中保存了session以及owner屬性,owner屬性表示了集合屬性所屬的one 側的實體。spa

 

非集合類屬性的延遲加載相對比較複雜。僅經過@Basic(fetch = FetchType.LAZY)註解是沒法實現延遲加載的。須要讓實體實現FieldHandled接口,聲明FieldHandler屬性,經過攔截器 原理注入對應的FieldHandler屬性,起到相似於上述代理類的做用,FieldHandler一樣也保持了session,以及須要延遲加載的屬 性。.net

 

咱們發現對非集合屬性即時設置了@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 }
 1 package cn.happy.entity;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Column;
 8 import javax.persistence.Entity;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.GenerationType;
11 import javax.persistence.Id;
12 import javax.persistence.JoinColumn;
13 import javax.persistence.OneToMany;
14 import javax.persistence.SequenceGenerator;
15 import javax.persistence.Table;
16 import javax.persistence.Transient;
17 
18 import org.hibernate.annotations.Cascade;
19 
20 @Entity
21 @Table(name = "DEPT")
22 public class Dept {
23     @Id
24     @Column(name = "DEPTNO")
25     @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="dept_num")
26     @SequenceGenerator(name="dept_num",sequenceName="dept_num_no",allocationSize=1,initialValue=1)
27     private Integer deptNo;
28 
29     @Column(name = "DEPTNAME")
30     private String deptName;
31 
32 
33     public Integer getDeptNo() {
34         return deptNo;
35     }
36 
37     public void setDeptNo(Integer deptNo) {
38         this.deptNo = deptNo;
39     }
40 
41     public String getDeptName() {
42         return deptName;
43     }
44 
45     public void setDeptName(String deptName) {
46         this.deptName = deptName;
47     }
48 }

 

 1 /**
 2      * 註解測試多對一映射   員工表(多)對應部門表(一)的映射,即只在員工表中植入部門表的信息
 3      * */
 4     @Test
 5     public void manytooneSingle(){
 6         
 7         /**
 8          * 查詢操做
 9          * **/
10         /*SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory();
11         Session session = sf.openSession();
12         
13         Emp emp=(Emp)session.load(Emp.class, 4);
14         
15         System.out.println(emp.getEmpName()+"\t"+emp.getDept().getDeptName());*/
16         
17         /**
18          * 添加操做
19          * **/
20         SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory();
21         Session session = sf.openSession();
22         Transaction tx = session.beginTransaction();
23         Dept dept = (Dept)session.load(Dept.class, 3);
24         
25         Emp emp=new Emp();
26         emp.setEmpName("戶夢豔");
27         emp.setEmpNo(001);
28         emp.setDept(dept);
29         
30         Emp emp2=new Emp();
31         emp2.setEmpName("戶夢豔2");
32         emp2.setEmpNo(002);
33         emp2.setDept(dept);
34         
35         session.save(emp);
36         session.save(emp2);
37         tx.commit();
38         session.close();
39         
40         
41     }

 

一對多雙單向配置

 1 package cn.happy.entity;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Column;
 8 import javax.persistence.Entity;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.GenerationType;
11 import javax.persistence.Id;
12 import javax.persistence.JoinColumn;
13 import javax.persistence.OneToMany;
14 import javax.persistence.SequenceGenerator;
15 import javax.persistence.Table;
16 import javax.persistence.Transient;
17 
18 
19 @Entity
20 @Table(name="Dept")
21 public class Dept {
22     @Id    
23     @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="dept_num")
24     @SequenceGenerator(name="dept_num",sequenceName="dept_num_no",allocationSize=1,initialValue=1)
25     private Integer deptNo;
26     @Column
27     private String deptName;
28     
29     
30     @OneToMany(cascade={CascadeType.ALL})
31     @JoinColumn(name="deptno")
32     private Set<Emp> emps=new HashSet<Emp>();
33 
34     public Set<Emp> getEmps() {
35         return emps;
36     }
37 
38     public void setEmps(Set<Emp> emps) {
39         this.emps = emps;
40     }
41 
42     public Integer getDeptNo() {
43         return deptNo;
44     }
45 
46     public void setDeptNo(Integer deptNo) {
47         this.deptNo = deptNo;
48     }
49 
50     public String getDeptName() {
51         return deptName;
52     }
53 
54     public void setDeptName(String deptName) {
55         this.deptName = deptName;
56     }
57 }

 

 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 import org.hibernate.bytecode.javassist.FieldHandled;
17 import org.hibernate.bytecode.javassist.FieldHandler;
18 
19 
20 @Entity
21 @Table(name = "EMP")
22 public class Emp {
23     
24     
25     
26     @Id
27     @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="emp_num")
28     @SequenceGenerator(name="emp_num",sequenceName="emp_num_no",allocationSize=1,initialValue=9)
29     private Integer empNo;
30 
31     @Column
32     private String empName;
33     
34    
35 //    @ManyToOne
36 //    @JoinColumn(name="deptno")
37 //    @Basic(fetch=FetchType.LAZY)
38 //    private Dept dept;
39 //    
40 //    public Dept getDept() {
41 //        return dept;
42 //    }
43 //
44 //    public void setDept(Dept dept) {
45 //        this.dept = dept;
46 //    }
47 
48     public Emp() {
49         super();
50     }
51 
52     public Emp(Integer empNo, String empName) {
53         super();
54         this.empNo = empNo;
55         this.empName = empName;
56     }
57 
58     public Integer getEmpNo() {
59         return empNo;
60     }
61 
62     public void setEmpNo(Integer empNo) {
63         this.empNo = empNo;
64     }
65 
66     public String getEmpName() {
67         return empName;
68     }
69 
70     public void setEmpName(String empName) {
71         this.empName = empName;
72     }
73     
74 
75 }

 

 1 /**
 2      * 測試一對多單向添加操做
 3      * */
 4     @Test
 5     public void insertOneToManySingle(){
 6         Emp emp=new Emp();
 7         emp.setEmpName("李小鵬");
 8         
 9         Emp emp2=new Emp();
10         emp2.setEmpName("王想一想");
11         
12         Dept dept=new Dept();
13         dept.setDeptName("教務部");
14         //設置級聯操做
15         dept.getEmps().add(emp);
16         dept.getEmps().add(emp2);
17         
18         session.save(dept);
19         tx.commit();
20         System.out.println("insert ok");
21         
22     }

 

 1     /**
 2      * 測試一對多單向查詢操做
 3      * */
 4     @Test
 5     public void selectOneToManySingle(){
 6         Dept dept = (Dept)session.load(Dept.class, 1);
 7         System.out.println("======================");
 8         System.out.println("部門名稱:"+dept.getDeptName());
 9         System.out.println("=======================");
10         //體現了延遲加載
11         for (Emp emp : dept.getEmps()) {
12             System.out.println("僱員名稱:"+emp.getEmpName());
13         }
14         //Emp emp = (Emp)session.load(Emp.class, 1);
15         
16         
17     }

 

 

一對多雙向配置

 1 package cn.happy.entity;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Column;
 8 import javax.persistence.Entity;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.GenerationType;
11 import javax.persistence.Id;
12 import javax.persistence.JoinColumn;
13 import javax.persistence.OneToMany;
14 import javax.persistence.SequenceGenerator;
15 import javax.persistence.Table;
16 import javax.persistence.Transient;
17 
18 
19 @Entity
20 @Table(name="Dept")
21 public class Dept {
22     @Id    
23     @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="dept_num")
24     @SequenceGenerator(name="dept_num",sequenceName="dept_num_no",allocationSize=1,initialValue=1)
25     private Integer deptNo;
26     @Column
27     private String deptName;
28     
29     
30     @OneToMany(mappedBy="dept",cascade={CascadeType.ALL})
31    
32     private Set<Emp> emps=new HashSet<Emp>();
33 
34     public Set<Emp> getEmps() {
35         return emps;
36     }
37 
38     public void setEmps(Set<Emp> emps) {
39         this.emps = emps;
40     }
41 
42     public Integer getDeptNo() {
43         return deptNo;
44     }
45 
46     public void setDeptNo(Integer deptNo) {
47         this.deptNo = deptNo;
48     }
49 
50     public String getDeptName() {
51         return deptName;
52     }
53 
54     public void setDeptName(String deptName) {
55         this.deptName = deptName;
56     }
57 }

 

 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 import org.hibernate.bytecode.javassist.FieldHandled;
17 import org.hibernate.bytecode.javassist.FieldHandler;
18 
19 
20 @Entity
21 @Table(name = "EMP")
22 public class Emp {
23     
24     
25     
26     @Id
27     @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="emp_num")
28     @SequenceGenerator(name="emp_num",sequenceName="emp_num_no",allocationSize=1,initialValue=9)
29     private Integer empNo;
30 
31     @Column
32     private String empName;
33     
34    
35     @ManyToOne
36     @JoinColumn(name="deptno")
37     @Basic(fetch=FetchType.LAZY)
38     private Dept dept;
39     
40     public Dept getDept() {
41         return dept;
42     }
43 
44     public void setDept(Dept dept) {
45         this.dept = dept;
46     }
47 
48     public Emp() {
49         super();
50     }
51 
52     public Emp(Integer empNo, String empName) {
53         super();
54         this.empNo = empNo;
55         this.empName = empName;
56     }
57 
58     public Integer getEmpNo() {
59         return empNo;
60     }
61 
62     public void setEmpNo(Integer empNo) {
63         this.empNo = empNo;
64     }
65 
66     public String getEmpName() {
67         return empName;
68     }
69 
70     public void setEmpName(String empName) {
71         this.empName = empName;
72     }
73     
74 
75 }

 

 

 1     /**
 2      * 雙向一對多的添加操做
 3      * */
 4     @Test 
 5     public void oneToManyDouble(){
 6         Dept dept=new Dept();
 7         dept.setDeptName("財務部");
 8         
 9         Emp emp=new Emp();
10         emp.setEmpName("鄒樂");
11         emp.setDept(dept);
12         
13         Emp emp2=new Emp();
14         emp2.setEmpName("範子陽");
15         emp2.setDept(dept);
16         
17         
18         dept.getEmps().add(emp);
19         dept.getEmps().add(emp2);
20         
21         session.save(dept);
22         tx.commit();
23     }
24     

 

 1 /**
 2      * 雙向一對多的查詢操做
 3      * */
 4     @Test 
 5     public void selectOneToManyDouble(){
 6         
 7         Dept dept = (Dept)session.load(Dept.class, 1);
 8         System.out.println("部門名稱:"+dept.getDeptName());
 9         for (Emp emp : dept.getEmps()) {
10             System.out.println("職工姓名:"+emp.getEmpName());
11         }
12         
13         System.out.println("==================================================");
14         
15         Emp emp = (Emp)session.load(Emp.class, 1);
16         System.out.println("職工姓名:"+emp.getEmpName()+"\t部門名稱:"+emp.getDept().getDeptName());
17     }
18     
相關文章
相關標籤/搜索