Hibernate中用注解配置一对多双向关联和多对一单向关联

Hibernate中用注解配置一对多双向关联和多对一单向关联

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 }
 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     
时间: 2024-08-08 09:35:34

Hibernate中用注解配置一对多双向关联和多对一单向关联的相关文章

Hibernate初学---注解配置

ssh框架是每个java程序员的基本功,工作中虽然没有用到,还是学习一下,做点学习笔记,算是一点积累吧. 废话不多说,先上手来一个简单的demo,感受一把. 开发工具:myeclipse 10 数据库:mysql 创建个简单的java工程, 第一步,创建一个学生类,代码如下: package com.huawei.vo; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.p

Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate映射文件中主键自增规则.Hibernate实例状态(瞬时状态.持久化状态.托管状态).Hibernate初始化类获取session等方法 下图内容保存数据过程 下面内容保存数据顺序.查询数据方法 get().load()和延迟加载.删除数据 下图内容删除对象顺序.修改数据顺序 下面内容关联关系映射.

hibernate多对一单向关联注解方式

多对一单向关联,在多的一方加上一的一方作为外键.在程序里表现为:在多的一方加上一的引用. 小组类Group,用户User: Group: package com.oracle.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(n

Hibernate之关于多对多单向关联映射

[Hibernate]之关于多对多单向关联映射 老师和学生,最典型的多对多关联, Teacher和Student.所谓单向意思就是说.老师知道自己的教的是哪些学生而学生不知道是哪些老师教. 也能够这么说,在查询的时候,通过老师能够级联查询出学生,可是通过学生不能够级联查询出老师. 而多对多最麻烦的是怎么自己定义我们中间表的,表名和列名,这个是重要的! Annotations配置 @Entity @Table(name="t_teacher") publicclass Teacher {

hibernate之关于多对一单向关联映射

[Hibernate]之关于多对一单向关联映射 在项目的开发中多对一的单向关联映射是最常见的,关联映射!这个着重详细讲解一下! 例如,我们现在一个组(Group)和人(Person) (Person表) id name 1 张三 2 李四 (Group表) id name p_id 1 财务组 1 2 财务组 2 由上表我们发现,是不是出现数据的重复?财务组在重复! 所以,在多对一的单向映射中,我们通常是在多的一方加上外键来关联少的一方. 那么在这个关系中(Group)是少的一方,(Person

hibernate之多对一单向关联

一个工作组(Group)里可以有多个用户(User),一个User只属于一个Group,这是典型的多对一的关系.在多对一的关系中正确的数据库设计是在多的这方(在这里是User这方)加一个Group的外键.如果数据库设计的与之相反就会产生冗余,请看下面这个例子: 友情提示:这是错误的设计方法: GroupId GroupName UserId 1 Group_1 1 1 Group_1 2 UserId UserName 1 moluo 2 xingzhe 这样在一的这方(也就是Group这方)设

hibernate的映射之三(多对多单向关联)

Many-to-Many 多对多的映射可以使用一组Java集合不包含任何重复的元素来实现.我们已经看到了Hibernate如何设置映射集合. 集(SET)被映射到与映射表中<set>元素,并以java.util.HashSet初始化.您可以使用Set集合在类中时,集合不需要重复的元素. 在现实生活中多对多的例子挺多的. 例如:学生与老师,订单与商品等 下面我就以员工和项目来做例子,一个员工可以做多个项目,一个项目可以被多个员工做. 1.准备JavaBean 项目·实体·类 public cla

Hibernate关联关系配置(一对多、一对一和多对多)

第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系. 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多. 多对一:从订单的角度来说多个订单可以对应一个消费者,即为多对一. 一对多关系在hbm文件中的配置信息: 消费者(一方): <?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC

一口一口吃掉Hibernate(四)——多对一单向关联映射

hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它. 今天就来说说多对一的关联映射. 数据库中有多对一的关系,Hibernate自然也有对象的多对一的关联关系.比如用户和用户组,一个用户只属于一个组,一个组有多名用户.我们就可以说用户和用户组的关系就是多对一的关系.用对象的uml图表示一下: 在Hibernate中如何来实现呢?首先定义这两个实体类: pac