2.2、Hibernate用注解方式实现一对多、多对多关系
一、一对多关系
1、在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar
2、新建一个com.st.bean4 包,往包里面添加两个含有注解的类:
a)、DeptBean2类:
package com.st.bean4; import java.util.HashSet;
import java.util.Set; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table; import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator; @Entity //指定实体类
@Table(name="DEPT") //对应表的名称
@GenericGenerator(name="genID", strategy="increment") //声明主键生成策略
public class DeptBean2 {
@Id //指定主键
@GeneratedValue(generator="genID") //设定主键生成策略
@Column(name="ID") //指定类中的属性与表中的列的对应关系
private long id;
@Column(name="NAME") //指定类中的属性与表中的列的对应关系
private String name; @OneToMany //指定一对多关系
@Cascade(value={CascadeType.SAVE_UPDATE}) //设定级联关系
@JoinColumn(name="dept_id") //指定与本类主键所对应的外表的外键
private Set<EmployeeBean2> emp = new HashSet<EmployeeBean2>();
@Override
public String toString() {
return "DeptBean [id=" + id + ", name=" + name +"]";
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<EmployeeBean2> getEmp() {
return emp;
}
public void setEmp(Set<EmployeeBean2> emp) {
this.emp = emp;
}
}
b)、EmployeeBean类:
package com.st.bean4; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity //指定一个实体
@Table(name="employee") //指定表的名称
@GenericGenerator(name="genID", strategy="increment") //声明主键生成策略
public class EmployeeBean2 {
@Id //指定主键
@GeneratedValue(generator="genID") //设定主键生成策略
@Column(name="ID") //类中的属性和表中的列名的对应关系
private long id;
@Column(name="NAME")
private String name;
@Column(name="SEX")
private String sex;
@Column(name="JOB")
private String job;
@ManyToOne// 指定多对一关系 //指定多对一关系
@JoinColumn(name="DEPT_ID")
//一个员工对应于一个部门号,所以这里不用集合
private DeptBean2 dept ; //注意这个地方不要new对象,否则会无法运行
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public DeptBean2 getDept() {
return dept;
}
public void setDept(DeptBean2 dept) {
this.dept = dept;
}
@Override
public String toString() {
return "EmployeeBean [id=" + id + ", name=" + name + ", sex=" + sex
+ ", job=" + job + ", dept=" + dept
+ "]";
}
}
3、在hibernate.cfg.xml文件中引入上面两个类的映射
<mapping class="com.st.bean5.UserBean2" />
<mapping class="com.st.bean5.RoleBean2" />
4、在BeanTest中添加相应的测试方法:
@Test
public void bean4test1(){
Session session = HibernateTools.openSession();
Transaction tran = session.beginTransaction();
//首先在dept中新增一条数据,再关联的在employee中新增一条数据
//DeptBean2 dept = new DeptBean2();
//先读去dept中的数据,再在读取的基础上关联的在employee中新增一条数据
DeptBean2 dept = (DeptBean2) session.get(DeptBean2.class,1L); //1L代表主键
EmployeeBean2 emp = new EmployeeBean2();
//dept.setName("技术部");
emp.setName("陈泽俊");
emp.setSex("男");
emp.setJob("STM32");
dept.getEmp().add(emp);
session.save(dept);
//确认提交事物
tran.commit();
}
二、多对多关系
1、新建一个com.st.bean4 包,往包里面添加两个含有注解的类
a)、UserBean2:
package com.st.bean5;
import java.util.HashSet;
import java.util.Set; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table; import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator; @Entity //实体
@Table(name="T_USER") //表名
@GenericGenerator(name="genID", strategy="increment") //声明主键生成策略
public class UserBean2 {
@Id //指定主键
@GeneratedValue(generator="genID") //设定主键生成策略
@Column(name="ID") //指定类的属性和表的字段的对应关系
private long id;
@Column(name="NAME")
private String name;
@Column(name="SEX")
private String sex;
@ManyToMany //指定多对多关系
@Cascade(value={CascadeType.SAVE_UPDATE}) //设置级联关系
@JoinTable(name="USER_ROLE", //指定第三张表
joinColumns={@JoinColumn(name="USER_ID")}, //本表与中间表的外键对应
inverseJoinColumns={@JoinColumn(name="ROLE_ID")}) //另一张表与第三张表的外键的对应关系
private Set<RoleBean2> role = new HashSet<RoleBean2>();
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Set<RoleBean2> getRole() {
return role;
}
public void setRole(Set<RoleBean2> role) {
this.role = role;
}
@Override
public String toString() {
return "UserBean [id=" + id + ", name=" + name + ", sex=" + sex
+ ", role=" + role + "]";
}
}
b)、RoleBean类:
package com.st.bean5;
import java.util.HashSet; import java.util.Set; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table; import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator; @Entity //实体
@Table(name="T_ROLE") //表名
@GenericGenerator(name="genID", strategy="increment")//声明主键生成策略
public class RoleBean2 {
@Id //主键
@GeneratedValue(generator="genID") //设置主键生成策略
@Column(name="ID") //类中的属性与表的字段的对应关系
private long id;
@Column(name="POST")
private String post;//职位
@Column(name="PAY")
private int pay; //薪资
@ManyToMany //多对多关系
@Cascade(value={CascadeType.SAVE_UPDATE}) //级联关系
@JoinTable(name="USER_ROLE", //中间表的名称
joinColumns={@JoinColumn(name="ROLE_ID")}, //本表与中间表的外键对应关系
inverseJoinColumns={@JoinColumn(name="USER_ID")}) //另一张表与中间表的外键的对应关系
private Set<UserBean2> user = new HashSet<UserBean2>(); public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getPost() {
return post;
}
public void setPost(String post) {
this.post = post;
}
public int getPay() {
return pay;
}
public void setPay(int pay) {
this.pay = pay;
}
public Set<UserBean2> getUser() {
return user;
}
public void setUser(Set<UserBean2> user) {
this.user = user;
}
@Override
public String toString() {
return "RoleBean [id=" + id + ", post=" + post + ", pay=" + pay + "]";
}
}
2、在hibernate.cfg.xml中引入UserBean2和RoleBean2这两个类的映射:
<mapping class="com.st.bean5.UserBean2" />
<mapping class="com.st.bean5.RoleBean2" />
3、在BeanTest类中添加测试方法:
@Test
public void bean5test1(){
// 获取一个会话
Session session = HibernateTools.openSession();
//开启一次事物
Transaction tran = session.beginTransaction();
UserBean2 user = new UserBean2();
// RoleBean2 role = (RoleBean2) session.get(RoleBean2.class,1L);
RoleBean2 role = new RoleBean2(); user.setName("汪文仕");
user.setSex("男"); role.setPost("博士");
role.setPay(10000); role.getUser().add(user);
session.save(role);
//确认提交事物
tran.commit();
}
@Test
public void bean5test2(){
// 获取一个会话
Session session = HibernateTools.openSession();
/* List<UserBean> list = session.createCriteria(UserBean.class).list();
for(UserBean user : list)
System.out.println(user);*/
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";
List<Map<String,Object>> list = session.createQuery(hql).list();
for(Map<String,Object> data : list)
System.out.println(data);
}
三、注意:
1、引入了注解需要的jar包后要先删除Java EE 5 Library这个库,否则会两个jar包中的类产生冲突
2、在多表操作时最好设置级联关系,不然对表操作时要先读取一个类的数据,再将新建的一个类的数据添加到这个类上才成功对三张表同时操作。
2.2、Hibernate用注解方式实现一对多、多对多关系的更多相关文章
- Hibernate用注解方式实现一对多、多对多关系
一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...
- hibernate annotation注解方式来处理映射关系
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式 ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份
SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...
- Hibernate基于注解方式配置来实现实体和数据库之间存在某种映射关系
实体和数据库之间存在某种映射关系,hibernate根据这种映射关系完成数据的存取.在程序中这种映射关系由映射文件(*.hbm.xml)或者java注解(@)定义. 本文以java注解的形式总结映射关 ...
- hibernate中一对多多对一关系设计的理解
1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdept ...
- SQLAlchemy_定义(一对一/一对多/多对多)关系
目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...
- 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】
一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...
- Hibernate基于注解方式的各种映射全面总结
1. 使用Hibernate Annotation来做对象关系映射 1) 添加必须包: hibernate-jpa-2.0-api-1.0.0.Final.jar 2) 在实体类中添加JPA的标准注解 ...
随机推荐
- Arduino 1602液晶屏实验和程序
在Arduino IDE中, 项目->加载库->管理库中搜索LiquidCrystal,然后安装即可 1.接线图 2.引脚图 3.最简单程序 #include <LiquidCrys ...
- WPF 自定义DateControl DateTime控件
自定义日期控件,月份选择.如下是日期的一些效果图. 具体的样式.颜色可以根据下面的代码,自己调节即可 1.日期控件的界面 <UserControl x:Class="WpfApp ...
- 《Note --- Unreal 4 --- behavior tree》
Web: https://docs.unrealengine.com/latest/INT/Engine/AI/BehaviorTrees/index.html Test project: D:\En ...
- 项目自动化建构工具gradle 入门5——在intellij中做一个gradle的web工程
之前的几个小节,都是纯手工建文件夹,纯手工拷贝war包,或者纯手工解压个zip看看结果,,,,这还是我写了玩的helloWorld.若是玩大工程.几十个人的团队协同开发时,这么玩,,,,暴躁的程序员估 ...
- python基础-面向对象进阶
一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- java学习笔记之IO一()
1.缓冲输入文件 2.从内存输入 3.格式化的内存输入 4.基本的文本输出 示例: public class BrAndBwOrPwDemo { public static void main(Str ...
- Android 轮换页面+TabHost 实例
最终效果展示: 首先我们需要一个ViewPager控件,不过可以发现在左侧的控件列表中并没有这个控件 这时我们要去升级包中查看 然后在厘米找到 ViewPager.class 这时我们双击这个发现不能 ...
- Javascript实现时间转换为多少天前
//实现时间转换,这篇文章发布时间为 2016/1/20 19:59:30 文章发表时间戳为:1453291170000于:11月前function getDateDiff(dateTimeStamp ...
- Git怎样撤销一次分支的合并Merge
出现的问题: 某一天,所有的开发文件已经在development分支上,但是这时候,线上出了一个问题,需要及时修复,于是从master分支上,拉了一个bug分支,进行处理,master分支本应合并bu ...
- Android中利用AIDL机制调用远程服务
服务端: //CalculateInterface.aidl package com.itheima.aidl.calculate; interface CalculateInterface { do ...