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的更多相关文章

  1. JPA关系映射之many-to-many

    @ManyToMany Board表实体类 @Entity @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Table(nam ...

  2. Spring Data JPA 关系映射(一对一,一对多,多对多 )

    CascadeType.REMOVE 级联删除操作,删除当前实体时,与它有映射关系的实体也会跟着被删除.CascadeType.MERGE 级联更新(合并)操作,当Student中的数据改变,会相应地 ...

  3. JPA关系映射之one-to-one

    一对一关联有两种实现方式:一种是共享的主键关联,另一种是一对一的外键关联 1.共享的主键关联:让两个对象具有共同的主键值,以表明他们之间的一一对应关系. Person.java类 public cla ...

  4. [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

  5. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  6. JPA总结——实体关系映射(一对多@OneToMany)

    JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...

  7. JPA 对象关系映射之关联关系映射策略

    关联关系映射 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一.一对多和多对多几种关系.细分起来他们又有单向和双向之分.下面我们逐一介绍一下. 回页首 单向 OneToOne 单向一 ...

  8. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

  9. Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

随机推荐

  1. java程序给short变量赋0xff报异常

    在java程序中以二进制或十六进制表示的数比如0x01默认类型为int.所以付给short类型时要强制类型转换. short q = (short) 0b1111111111111111; Syste ...

  2. Ubuntu与Centos在登陆安全方面的比较

    Ubuntu在安装时创建的普通用户默认具有sudo权限,默认root没有设置密码,可以通过自建用户来执行sudo passwd 为root设置密码;Centos在安装时创建的普通用户默认没有sudo权 ...

  3. 四种JavaScript隐式类型转换的总结

    一般存在四种情况,JavaScript会对变量的数据类型进行转换. 目录 * if中的条件会被自动转为Boolean类型 * 会被转为false的数据 * 会被转为true的数据 * 参与+运算都会被 ...

  4. 转每天一个linux命令(14):head 命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  5. 中间件学习之RMI+JDBC远端数据库的访问

    问题: RMI+JDBC远端数据库的访问.实现简单的成绩查询系统(创建表,录入成绩,查询成绩等).在服务器端,通过JDBC访问数据库.客户端调用服务端提供的各种数据库操作. 环境准备: (1).确保J ...

  6. Cognos 11.0快速开发指南 Ⅱ

    1.    创建报表 在创建好数据源之后,我们就可以创建报表了,报表的开发是浏览器中完成的,这里我选用了chrome浏览器,在地址栏输入:http://localhost:80/ibmcognos ( ...

  7. adb 安装apk 报错:Failure [INSTALL_FAILED_ALREADY_EXISTS]

    遇到INSTALL_FAILED_ALREADY_EXISTS问题,直接通过adb install -r xxx.apk命令安装apk即可

  8. 【搬运工】——初识Lua(转)

    使用 Lua 编写可嵌入式脚本 Lua 提供了高级抽象,却又没失去与硬件的关联. 虽然编译性编程语言和脚本语言各自具有自己独特的优点,但是如果我们使用这两种类型的语言来编写大型的应用程序会是什么样子呢 ...

  9. java面向对象(五)之多态

    多态 面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. ...

  10. [js高手之路]node js系列课程-图解express+supervisor+ejs用法

    上文通过node js自带的http模块搭建了一个简易的服务器,实际在开发中,一般用的是express框架,本文我们就来讲讲项目开发中必备不可少的几样东西: 服务器( express ) 路由( ex ...