一、一对多关系
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 ????@Override35 ????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 ????@Override62 ????public String toString() {63 ????????return "EmployeeBean [id=" + id + ", name=" + name + ", sex=" + sex64 ????????????????+ ", job=" + job + ", dept=" + dept65 ????????????????+ "]";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 ????@Override61 ????public String toString() {62 ????????return "UserBean [id=" + id + ", name=" + name + ", sex=" + sex63 ????????????????+ ", 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 ????@Override63 ????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 ????@Test23 ????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 ????}
三、注意:
1、引入了注解需要的jar包后要先删除Java EE 5 Library这个库,否则会两个jar包中的类产生冲突
2、在多表操作时最好设置级联关系,不然对表操作时要先读取一个类的数据,再将新建的一个类的数据添加到这个类上才成功对三张表同时操作。
2.2、Hibernate用注解方式实现一对多、多对多关系
原文地址:https://www.cnblogs.com/hao-lei/p/8146036.html