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

相关文章

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

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这

c++ 和C语言的兼容性关系

C++ 和 C 语言有很高的兼容性,但也存在一些差异和限制。下面是它们的兼容性关系的详细介绍: 兼容性 C++ 是 C 的超集: C++ 语言设计为兼容 C 语言的语法和功能,大部分 C 代码可以在 C++ 编译器中编译运行。 标准库兼容性: C++ 标准库包含了 C 标准库的内容,如 stdio.h、stdlib.h、string.h 等头文件,但 C++ 的标准库也提供了额外的功能,如