JPA关系映射之one-to-many和many-to-one
one-to-many(一对多)和many-to-one(多对一)双向关联
假设部门与员工是一对多关系,反过来员工与部门就是多对一关系。
Dept.java类
public class Dept implements java.io.Serializable {
// Fields
private Integer deptId;
private String deptName;
private Set<Emp> emps=new HashSet<Emp>();
// Constructors
/** default constructor */
public Dept() {
}
/** full constructor */
public Dept(String deptName) {
this.deptName = deptName;
}
// Property accessors
public Integer getDeptId() {
return this.deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return this.deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}
Emp.java类
public class Emp implements java.io.Serializable {
// Fields
private Integer empNo;
private String empName;
private Date empBrithday;
private Dept dept;
// Constructors
/** default constructor */
public Emp() {
}
/** full constructor */
public Emp(String empName, Date empBrithday) {
this.empName = empName;
this.empBrithday = empBrithday;
}
// Property accessors
public Integer getEmpNo() {
return this.empNo;
}
public void setEmpNo(Integer empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return this.empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Date getEmpBrithday() {
return this.empBrithday;
}
public void setEmpBrithday(Date empBrithday) {
this.empBrithday = empBrithday;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
Dept.hbm.xml
<hibernate-mapping>
<class name="com.db.entity.Dept" table="dept" catalog="mydb">
<id name="deptId" type="java.lang.Integer">
<column name="deptId" />
<generator class="native" />
</id>
<property name="deptName" type="java.lang.String">
<column name="deptName" length="32" />
</property>
<set name="emps" inverse="true" cascade="all">
<key column="deptId" not-null="true" />
<one-to-many class="com.db.entity.Emp" />
</set>
</class>
</hibernate-mapping>
Emp.hbm.xml
<hibernate-mapping>
<class name="com.db.entity.Emp" table="emp" catalog="mydb">
<id name="empNo" type="java.lang.Integer">
<column name="empNo" />
<generator class="native" />
</id>
<property name="empName" type="java.lang.String">
<column name="empName" length="20" />
</property>
<property name="empBrithday" type="java.util.Date">
<column name="empBrithday"/>
</property>
<many-to-one name="dept" column="deptId" class="com.db.entity.Dept" not-null="true" fetch="select" cascade="save-update,delete"/>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/mydb
</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">
MyDBAccount
</property>
<mapping resource="com/db/entity/Dept.hbm.xml" />
<mapping resource="com/db/entity/Emp.hbm.xml" />
</session-factory>
</hibernate-configuration>
测试用例
public class TestOneMany {
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
Session session=HibernateSessionFactory.getSession();
Dept dept1=new Dept();
dept1.setDeptName("开发部");
Emp emp1=new Emp();
emp1.setEmpName("王洋");
String brithString="1999-03-05";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date brithday=sdf.parse(brithString);
emp1.setEmpBrithday(brithday);
Emp emp2=new Emp();
emp2.setEmpName("李林");
brithString="2005-02-07";
brithday=sdf.parse(brithString);
emp2.setEmpBrithday(brithday);
//把emp和dpt分别添加到对方的实力对象中
dept1.getEmps().add(emp1);
dept1.getEmps().add(emp2);
emp1.setDept(dept1);
emp2.setDept(dept1);
session.beginTransaction();
session.save(dept1);
session.getTransaction().commit();
}
}
注意:
在一的set配置中声明inverse=“true”,意味着Dept不在作为主控方,将关联关系的维护工作交给关联对象Emp来完成。在保存dept1对象的时不在关心Emp类中dept属性对应的deptId列,必须由Emp自己去维护,即设置emp.setDept(dept)
上述操作完成的sql语句是:
Hibernate: insert into mydb.dept (deptName) values (?)
Hibernate: insert into mydb.emp (empName, empBrithday, deptId) values (?, ?, ?)
Hibernate: insert into mydb.emp (empName, empBrithday, deptId) values (?, ?, ?)
JPA关系映射之one-to-many和many-to-one的更多相关文章
- JPA关系映射之many-to-many
@ManyToMany Board表实体类 @Entity @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Table(nam ...
- Spring Data JPA 关系映射(一对一,一对多,多对多 )
CascadeType.REMOVE 级联删除操作,删除当前实体时,与它有映射关系的实体也会跟着被删除.CascadeType.MERGE 级联更新(合并)操作,当Student中的数据改变,会相应地 ...
- JPA关系映射之one-to-one
一对一关联有两种实现方式:一种是共享的主键关联,另一种是一对一的外键关联 1.共享的主键关联:让两个对象具有共同的主键值,以表明他们之间的一一对应关系. Person.java类 public cla ...
- [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- JPA总结——实体关系映射(一对多@OneToMany)
JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...
- JPA 对象关系映射之关联关系映射策略
关联关系映射 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一.一对多和多对多几种关系.细分起来他们又有单向和双向之分.下面我们逐一介绍一下. 回页首 单向 OneToOne 单向一 ...
- JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明
JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...
- Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
随机推荐
- softmax函数
该函数作用于输出层之上,用于改善输出层神经元饱和时与该神经元直接相关的w和bias学习率下降的问题. 定义: 这表明,在用柔性最大值函数定义输出神经元的输出时,神经元的输出是一种概率分布,所有输出层神 ...
- SLF4J源码解析-LoggerFactory(二)
承接前文SLF4J源码解析-LoggerFactory(一),本文则主要针对获取ILoggerFactory对象作下简单的分析 LoggerFactory#getILoggerFactory() 源码 ...
- MySQL 网络访问连接
查看 /etc/hosts配置文件 [hotspot@bogon ~]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localh ...
- APUE 1 -- Unix数据结构
Unix 类操作系统支持不同进程间共享文件.对于所有的I/O,内核使用3种数据结构来表示一个打开的文件. 进程表.每个进程在进程表中有其相应的入口.文件结构中,每个进程表的入口是文件描述符表,每个文件 ...
- PHP迭代与递归实现无限级分类
无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳. 1.循环迭代实现 $arr = [ 1=>['id'=>1,'name'=>'父1','father'=& ...
- 基于tgp协议的套接字的 粘包解决
客户端 import socket import struct import json phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM ...
- matplotlib 出图示例
如果你想要在Linxu中获得一个高效.自动化.高质量的科学画图的解决方案,应该考虑尝试下matplotlib库.Matplotlib是基于python的开源科学测绘包,基于python软件基金会许可证 ...
- Eclipse关闭项目
Eclipse 关闭项目 为什么要关闭项目? Eclipse 工作空间包含了多个项目.一个项目可以是关闭或开启状态. 项目打开过多影响有: 消耗内存 占用编译时间:在删除项目.class 文件(Cle ...
- Spring MVC控制层传递对象后在JSP页面中的取值方法
List<Order> orders = new ArrayList<Order>(); for (int i = 0; i < 3; i++) { Order t = ...
- redis 介绍和常用命令
redis 介绍和常用命令 redis简介 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键 ...