hibernate之表关系中的一对多

2024-06-03 00:48
文章标签 关系 hibernate 一对 之表

本文主要是介绍hibernate之表关系中的一对多,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库表与表的三种关系:

1. 一对一:一张表中的一条数据对应了另一张表中的一条数据,外键可以在任意一张表中

2. 一对多:一张表中的一条数据对应了另一张表中的多条数据,外键创建在多的一方中

3. 多对多:一张表中的多条数据对应了另一张表中的多条数据,建立中间表保存两张表的外键

一对多示例:

一方javabean:Customer.java

public class Customer {

private Long cust_id;

private String cust_name;

private String cust_source;

//使用set集合,表达一对多关系

private Set<LinkMan> linkMens = new HashSet<LinkMan>();

    //省略了所有setget方法...

}

一方映射文件Customer.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.example.domain" >

<class name="Customer" table="cst_customer" >

<id name="cust_id"  >

<generator class="native"></generator>

</id>

<property name="cust_name" column="cust_name" ></property>

<property name="cust_source" column="cust_source" ></property>

name属性:集合属性名 column属性: 外键列名 class属性: 与我关联的对象完整类名

cascade save-update: 级联保存更新 delete:级联删除 all:save-update+delete

    <set name="linkMens" cascade="save-update" >

<key column="lkm_cust_id" ></key>

<one-to-many class="LinkMan" />

</set>

</class>

</hibernate-mapping>

 

多方javabean:LinkMan.java

public class LinkMan {

private Long lkm_id;

private Character lkm_gender;

private String lkm_name;

private Customer customer ;//维护多对一关系

//getset方法省略...

}

多方映射文件:LinkMan.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.example.domain" >

<class name="LinkMan" table="cst_linkman" >

<id name="lkm_id"  >

<generator class="native"></generator>

</id>

<property name="lkm_gender"  ></property>

<property name="lkm_name"  ></property>

name:属性名 column属性: 外键列名 class属性: 与我关联的对象完整类名

    多的一方: 不能放弃维护关系的.外键字段就在多的一方

<many-to-one name="customer" column="lkm_cust_id" cascade="save-update"  class="Customer"  >

</many-to-one>

</class>

</hibernate-mapping>

测试代码:

public class Demo {

@Test

//创建客户和联系人级联保存

public void fun1(){

Session session = HibernateUtils.openSession();

Transaction tx = session.beginTransaction();

Customer c = new Customer();

c.setCust_name("客户");

LinkMan lm1 = new LinkMan();

lm1.setLkm_name("联系人1");

LinkMan lm2 = new LinkMan();

lm2.setLkm_name("联系人2");

//1.一方(Customer)关联多方(联系人)级联保存

    //c.getLinkMens().add(lm1);

    //c.getLinkMens().add(lm2);

//session.save(c);//执行五条sql语句:三条insert语句和两条update更新外键语句

 

//2.多方(LinkMan)关联一方(Customer)级联保存

lm1.setCustomer(c);

lm2.setCustomer(c);

session.save(lm1);//两条insert语句语句

session.save(lm2);//两条insert语句语句

//第二次insert Customer时候因为一级缓存,不会再执行,故一共只有三条insert语句

tx.commit();

session.close();

}

@Test

public void fun2(){//给客户增加联系人级联保存

Session session = HibernateUtils.openSession();

Transaction tx = session.beginTransaction();

Customer customer = session.get(Customer.class,8l);

LinkMan linkMan = new LinkMan();

linkMan.setLkm_name("联系人3");

//1.多方关联一方,保存多方对象

//linkMan.setCustomer(customer);

//session.save(linkMan);//执行两条sql语句:一条select语句 一条insert语句

//2.一方关联多方,保存一方对象

customer.getLinkMens().add(linkMan);

session.save(customer);//执行四条sql语句:两条select 一条insert 一条update

tx.commit();

session.close();

}

@Test

//为客户删除联系人关系(实质是删除一对多关系中多方联系人保存的外键),联系人不删除

public void fun3(){

Session session = HibernateUtils.openSession();

Transaction tx = session.beginTransaction();

Customer c = session.get(Customer.class,3l);

LinkMan lm = session.get(LinkMan.class, 11l);

//如果Customer不维护外键即设置了set标签的inverse="true",则不能移除关系(不会发出update语句把外键设置为null)

//1.Customer解除外键关系:执行4条sql语句:3条select语句 1条update语句

c.getLinkMens().remove(lm);

 

//一对多中多方LinkMan没有set标签,不能设置inverse属性,默认维护

//2.LinkMan解除外键关系:执行3条sql语句:2条select 1条update

//lm.setCustomer(null);

tx.commit();

session.close();

}

}

Hibernate中一对多的级联保存修改:

Hibernate中一对多的级联保存修改,由多方级联一方,由于外键在多方的原因,sql执行语句会大大减少

 

Hibernate中一对多的级联删除:

一方级联删除多方:

Customer c = session.get(Customer.class,1l);

session.delete(c);

多方级联删除一方:

LinkMan linkMan  = session.get(LinkMan .class,1l);

session.delete(linkMan);

1.多方级联删除一方,如果一的一方还关联了其他数据 则不能删除成功:3次select,1次update设置外键为null 2次delete

2.一方级联删除多方,可以级联删除关联的所有多方数据:sql执行顺序是:1.两次select查询一方和多方 2.一次update设置外键为null 3.N次delete(n=1+多方关联数据数目)


这篇关于hibernate之表关系中的一对多的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025572

相关文章

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity