2.2、Hibernate用注解方式实现一对多、多对多关系

一、一对多关系

  1、在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar

  2、新建一个com.st.bean4 包,往包里面添加两个含有注解的类:

    a)、DeptBean2类:

 1 package com.st.bean4;
 2
 3 import java.util.HashSet;
 4 import java.util.Set;
 5
 6
 7 import javax.persistence.Column;
 8 import javax.persistence.Entity;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.Id;
11 import javax.persistence.JoinColumn;
12 import javax.persistence.OneToMany;
13 import javax.persistence.Table;
14
15 import org.hibernate.annotations.Cascade;
16 import org.hibernate.annotations.CascadeType;
17 import org.hibernate.annotations.GenericGenerator;
18
19 @Entity                                               //指定实体类
20 @Table(name="DEPT")                                   //对应表的名称
21 @GenericGenerator(name="genID", strategy="increment") //声明主键生成策略
22 public class DeptBean2 {
23     @Id                                               //指定主键
24     @GeneratedValue(generator="genID")                //设定主键生成策略
25     @Column(name="ID")                                //指定类中的属性与表中的列的对应关系
26     private long id;
27     @Column(name="NAME")                              //指定类中的属性与表中的列的对应关系
28     private String name;
29
30     @OneToMany                                          //指定一对多关系
31     @Cascade(value={CascadeType.SAVE_UPDATE})         //设定级联关系
32     @JoinColumn(name="dept_id")                       //指定与本类主键所对应的外表的外键
33     private Set<EmployeeBean2> emp = new HashSet<EmployeeBean2>();
34     @Override
35     public String toString() {
36         return "DeptBean [id=" + id + ", name=" + name +"]";
37     }
38     public long getId() {
39         return id;
40     }
41     public void setId(long id) {
42         this.id = id;
43     }
44     public String getName() {
45         return name;
46     }
47     public void setName(String name) {
48         this.name = name;
49     }
50     public Set<EmployeeBean2> getEmp() {
51         return emp;
52     }
53     public void setEmp(Set<EmployeeBean2> emp) {
54         this.emp = emp;
55     }
56 }

    b)、EmployeeBean类:

 1 package com.st.bean4;
 2
 3 import javax.persistence.Column;
 4 import javax.persistence.Entity;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.Id;
 7 import javax.persistence.JoinColumn;
 8 import javax.persistence.ManyToOne;
 9 import javax.persistence.Table;
10
11 import org.hibernate.annotations.GenericGenerator;
12
13 @Entity   //指定一个实体
14 @Table(name="employee")   //指定表的名称
15 @GenericGenerator(name="genID", strategy="increment") //声明主键生成策略
16 public class EmployeeBean2 {
17     @Id                                               //指定主键
18     @GeneratedValue(generator="genID")                //设定主键生成策略
19     @Column(name="ID")                                //类中的属性和表中的列名的对应关系
20     private long id;
21     @Column(name="NAME")
22     private String name;
23     @Column(name="SEX")
24     private String sex;
25     @Column(name="JOB")
26     private String job;
27     @ManyToOne// 指定多对一关系                       //指定多对一关系
28     @JoinColumn(name="DEPT_ID")
29     //一个员工对应于一个部门号,所以这里不用集合
30     private DeptBean2 dept ;                          //注意这个地方不要new对象,否则会无法运行
31     public long getId() {
32         return id;
33     }
34     public void setId(long id) {
35         this.id = id;
36     }
37     public String getName() {
38         return name;
39     }
40     public void setName(String name) {
41         this.name = name;
42     }
43     public String getSex() {
44         return sex;
45     }
46     public void setSex(String sex) {
47         this.sex = sex;
48     }
49     public String getJob() {
50         return job;
51     }
52     public void setJob(String job) {
53         this.job = job;
54     }
55     public DeptBean2 getDept() {
56         return dept;
57     }
58     public void setDept(DeptBean2 dept) {
59         this.dept = dept;
60     }
61     @Override
62     public String toString() {
63         return "EmployeeBean [id=" + id + ", name=" + name + ", sex=" + sex
64                 + ", job=" + job + ", dept=" + dept
65                 + "]";
66     }
67 }

  3、在hibernate.cfg.xml文件中引入上面两个类的映射

1          <mapping class="com.st.bean5.UserBean2" />
2          <mapping class="com.st.bean5.RoleBean2" />

  4、在BeanTest中添加相应的测试方法:

 1     @Test
 2     public void bean4test1(){
 3         Session session = HibernateTools.openSession();
 4         Transaction tran = session.beginTransaction();
 5         //首先在dept中新增一条数据,再关联的在employee中新增一条数据
 6         //DeptBean2 dept = new DeptBean2();
 7         //先读去dept中的数据,再在读取的基础上关联的在employee中新增一条数据
 8         DeptBean2 dept = (DeptBean2) session.get(DeptBean2.class,1L); //1L代表主键
 9         EmployeeBean2 emp = new EmployeeBean2();
10         //dept.setName("技术部");
11         emp.setName("陈泽俊");
12         emp.setSex("男");
13         emp.setJob("STM32");
14         dept.getEmp().add(emp);
15         session.save(dept);
16         //确认提交事物
17         tran.commit();
18     }

 

二、多对多关系

  1、新建一个com.st.bean4 包,往包里面添加两个含有注解的类

    a)、UserBean2:

 1 package com.st.bean5;
 2 import java.util.HashSet;
 3 import java.util.Set;
 4
 5 import javax.persistence.Column;
 6 import javax.persistence.Entity;
 7 import javax.persistence.GeneratedValue;
 8 import javax.persistence.Id;
 9 import javax.persistence.JoinColumn;
10 import javax.persistence.JoinTable;
11 import javax.persistence.ManyToMany;
12 import javax.persistence.Table;
13
14 import org.hibernate.annotations.Cascade;
15 import org.hibernate.annotations.CascadeType;
16 import org.hibernate.annotations.GenericGenerator;
17
18 @Entity                                                //实体
19 @Table(name="T_USER")                                  //表名
20 @GenericGenerator(name="genID", strategy="increment")  //声明主键生成策略
21 public class UserBean2 {
22     @Id                                                //指定主键
23     @GeneratedValue(generator="genID")                 //设定主键生成策略
24     @Column(name="ID")                                 //指定类的属性和表的字段的对应关系
25     private long id;
26     @Column(name="NAME")
27     private String name;
28     @Column(name="SEX")
29     private String sex;
30     @ManyToMany                                        //指定多对多关系
31     @Cascade(value={CascadeType.SAVE_UPDATE})          //设置级联关系
32     @JoinTable(name="USER_ROLE",                       //指定第三张表
33                 joinColumns={@JoinColumn(name="USER_ID")},             //本表与中间表的外键对应
34                     inverseJoinColumns={@JoinColumn(name="ROLE_ID")})  //另一张表与第三张表的外键的对应关系
35     private Set<RoleBean2> role = new HashSet<RoleBean2>();
36     public long getId() {
37         return id;
38     }
39     public void setId(long id) {
40         this.id = id;
41     }
42     public String getName() {
43         return name;
44     }
45     public void setName(String name) {
46         this.name = name;
47     }
48     public String getSex() {
49         return sex;
50     }
51     public void setSex(String sex) {
52         this.sex = sex;
53     }
54     public Set<RoleBean2> getRole() {
55         return role;
56     }
57     public void setRole(Set<RoleBean2> role) {
58         this.role = role;
59     }
60     @Override
61     public String toString() {
62         return "UserBean [id=" + id + ", name=" + name + ", sex=" + sex
63                 + ", role=" + role + "]";
64     }
65 }

    b)、RoleBean类:

 1 package com.st.bean5;
 2 import java.util.HashSet;
 3
 4 import java.util.Set;
 5
 6 import javax.persistence.Column;
 7 import javax.persistence.Entity;
 8 import javax.persistence.GeneratedValue;
 9 import javax.persistence.Id;
10 import javax.persistence.JoinColumn;
11 import javax.persistence.JoinTable;
12 import javax.persistence.ManyToMany;
13 import javax.persistence.Table;
14
15 import org.hibernate.annotations.Cascade;
16 import org.hibernate.annotations.CascadeType;
17 import org.hibernate.annotations.GenericGenerator;
18
19 @Entity                                              //实体
20 @Table(name="T_ROLE")                                //表名
21 @GenericGenerator(name="genID", strategy="increment")//声明主键生成策略
22 public class RoleBean2 {
23     @Id                                              //主键
24     @GeneratedValue(generator="genID")               //设置主键生成策略
25     @Column(name="ID")                                 //类中的属性与表的字段的对应关系
26     private long id;
27     @Column(name="POST")
28     private String post;//职位
29     @Column(name="PAY")
30     private int pay;    //薪资
31     @ManyToMany                                      //多对多关系
32     @Cascade(value={CascadeType.SAVE_UPDATE})        //级联关系
33     @JoinTable(name="USER_ROLE",                     //中间表的名称
34                 joinColumns={@JoinColumn(name="ROLE_ID")},   //本表与中间表的外键对应关系
35                     inverseJoinColumns={@JoinColumn(name="USER_ID")}) //另一张表与中间表的外键的对应关系
36     private Set<UserBean2>  user = new HashSet<UserBean2>();
37
38     public long getId() {
39         return id;
40     }
41     public void setId(long id) {
42         this.id = id;
43     }
44     public String getPost() {
45         return post;
46     }
47     public void setPost(String post) {
48         this.post = post;
49     }
50     public int getPay() {
51         return pay;
52     }
53     public void setPay(int pay) {
54         this.pay = pay;
55     }
56     public Set<UserBean2> getUser() {
57         return user;
58     }
59     public void setUser(Set<UserBean2> user) {
60         this.user = user;
61     }
62     @Override
63     public String toString() {
64         return "RoleBean [id=" + id + ", post=" + post + ", pay=" + pay + "]";
65     }
66 }

  2、在hibernate.cfg.xml中引入UserBean2和RoleBean2这两个类的映射:

1          <mapping class="com.st.bean5.UserBean2" />
2          <mapping class="com.st.bean5.RoleBean2" />

  3、在BeanTest类中添加测试方法:

 1     @Test
 2     public void bean5test1(){
 3         // 获取一个会话
 4         Session session = HibernateTools.openSession();
 5         //开启一次事物
 6         Transaction tran = session.beginTransaction();
 7         UserBean2 user = new UserBean2();
 8 //        RoleBean2 role = (RoleBean2) session.get(RoleBean2.class,1L);
 9         RoleBean2 role = new RoleBean2();
10
11         user.setName("汪文仕");
12         user.setSex("男");
13
14         role.setPost("博士");
15         role.setPay(10000);
16
17         role.getUser().add(user);
18         session.save(role);
19         //确认提交事物
20         tran.commit();
21     }
22     @Test
23     public void bean5test2(){
24         // 获取一个会话
25         Session session = HibernateTools.openSession();
26 /*        List<UserBean> list = session.createCriteria(UserBean.class).list();
27         for(UserBean user : list)
28             System.out.println(user);*/
29         String hql = "select new Map(u.name as name,u.sex as sex,r.post as post,r.pay as pay) from UserBean2 u join u.role r";
30         List<Map<String,Object>> list = session.createQuery(hql).list();
31         for(Map<String,Object> data : list)
32             System.out.println(data);
33     }
时间: 2024-11-08 08:56:01

2.2、Hibernate用注解方式实现一对多、多对多关系的相关文章

hibernate annotation注解方式来处理映射关系

在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用annotation的方式可以更简介,所以这里就简单记录下通过annotation来配置各种映射关系,在hibernate4以后已经将annotation的jar包集成进来了,如果使用hibernate3的版本就需要引入annotation的jar包. 一.单对象操作 @Entity

PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本)

  1:运行  PowerDesigner15_Evaluation.exe 默认   2: 安装完毕后,不要执行,下面我们进行 破解 把 PowerDesigner15汉化+注册补丁  下的所有文件,覆盖 PD的安装目录下的文件 然后我们打开 PD,点击 帮助 –> About  看到下面窗口中红色方框,就表示已经破解 + 汉化成功 PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本)

hibernate中注解方式中的控制反转

都知道hibernate用xml方式配置关系时(one-to-many,many-to-many)可以添加控制反转属性 inverse=false(默认) 即将两表之间的关系交给对方来维护. inverse=true表示本方不维护关系,有对方维护关系 但是需注意的是,one-to-one关系是没有控制反转的,只能交由外键来维护关系. 从而导致在设置关系时,只能有外键方设置,移除关系时,只能从外键方来解除关系,删除记录时,只能先删外键方,在删主键方(save,remove,delete) 如果有控

框架 day32 Hibernate,一级缓存,关联关系映射(一对多,多对多)

一级缓存 概念 *在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java集合构成了Session缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期 *当session的save()方法持久化一个对象时,该对象被载入缓存, 以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中. 当试图get(). load()对象时,会判断缓存中是否存在该对象,有则返回,此时不查询数据库.没有再查询数据库 *Session 能够在

SQLAlchemy_定义(一对一/一对多/多对多)关系

目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中: from sqlalchemy import Table, Column, Integer, Forei

【Java EE 学习第46天】【Hibernate学习第三天】【多对多关系映射】

一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供set和get方法. 3.在配置映射文件的时候较一对多关系复杂. 二.映射文件 <set name="students" table="course_stu" cascade="save-update" inverse="true&quo

Hibernate基于注解方式的各种映射全面总结

1. 使用Hibernate Annotation来做对象关系映射 1) 添加必须包: hibernate-jpa-2.0-api-1.0.0.Final.jar 2) 在实体类中添加JPA的标准注解来进行对象关系映射.注解可以添加在属性上,也可以添加在getXxx()方法之上. a) @Entity 映射一个实体类 @Table 指定关联的表 b) @Id 映射OID c) @GeneratedValue 指定OID的生成策略 d) @Version 映射版本号属性 e) @Column 指定

hibernate 用注解方式生成uuid方法

//配置uuid,本来jpa是不支持uuid的,但借用hibernate的方法可以实现. @GeneratedValue(generator = "uuid") @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid") 加在id的get方法上面 下面具体操作下: 1.同样的 先新建一个java project.

Hibernate @Formula 注解方式

1.Formula的作用 Formula的作用就是用一个查询语句动态的生成一个类的属性 就是一条select count(*)...构成的虚拟列,而不是存储在数据库里的一个字段.用比较标准的说法就是:有时候,你想让数据库,而非JVM,来替你完成一些计算,也可能想创建某种虚拟列,你可以使用sql片段,而不是将属性映射(物理)列.这种属性是只读的(属性值由公式求得).Formula甚至可以包含sql子查询 2.Formula的使用 package aa; import static javax.pe