现有主表Report 从表reportUser
<set name="reportUsers" cascade="all-delete-orphan" lazy="false"
inverse="false">
<key column="report_id_" />
<one-to-many class="ReportUser" />
</set>
看Report中的set配置
我的期望是由Report 即一的一端完全控制,那么可能会出现如下问题:
1.若 lazy="true" ,在执行set=report.getReportUser()是会出现no session错误,因此这里设为lazy="false"
2.若cascade设为 “save-update”或其他, 那么你会发现,删除Report时, 并没有把reportUser删除,只是把 reportUser的report_id_字段设为了null
3.若1 ,2 没问题,如果你的数据库中 report_user_表的 关联字段 report_id_设为 not-null,
则,更新或删除 set的时候,会报不能为null的错误。
这是因为 hibernate执行update,create,delete都分为2步,先插入 null,或设为null,再update,
可以把hql打出来看
create: 先插入null,然后update它
会有 insert report_user_(...null,..)
然后才是 update report set ....
update 或 delete:先setnull,然后update delete
会有 update report_user_ set report_id_ =null where...
因此从表中的关联字段report_id_ 需要设为 可以为空 NULL
4. 对set的操作,不管是create,update,delete ,都需要从一的一方get
即report.getReportUser(),如果你new Set()给他,那么这个set将不被hibernate所管控,失去了控制, 会出现, you set is update by another tranc 你的set被另一个事务更改
因此,在report中的set 声明时 需要初始化,防止,create的时候 getReportUser 为空。
private Set<ReportUser> reportUser=new HashSet<ReportUser>();
5.操作示例
create:
set=report.getReportUser();
set.add(reportUser1);
set.add(reportUser2);
session...update(report);
reportUser1,2中不必要设置report 或是 reportId了,因为,此set已经是从report取出来的,会自动关联
update:
set=report.getReportUser();
set.clear();//先clear
set.add(reportUser1);
set.add(reportUser2);
session...update(report);
delete:
session...delete(report);
直接删除reort即可,reportUser会自动删除
更多关于cascade inverse 等属性的用法,参见http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html
分享到:
相关推荐
总之,Hibernate的多对多关联映射是解决复杂关系数据库设计的关键技术之一。通过合理的配置和使用,开发者可以轻松管理实体之间的多对多关系,提高开发效率。理解并熟练掌握这部分知识对于提升Java企业级应用开发...
本文将深入探讨Hibernate一对多映射的概念、配置以及实现方式,并结合提供的源代码和测试代码进行详细解析。 一、Hibernate一对多映射基础 1. 概念理解: 在数据库中,一对多关系意味着一个实体(如用户)可以...
1. 一对多映射(One-to-Many): 在这种关系中,一个实体(父实体)可以与多个其他实体(子实体)相关联。在Hibernate中,我们通常使用`@OneToMany`注解来表示这种关系。例如,一个学生可以有多个课程,而一门课程...
在Java的持久化框架Hibernate中,一对多映射是一种常见的关联关系,用于表示一个实体(类)可以与多个其他实体实例相关联的情况。本例子通过"BasicCar1"这个文件来展示如何配置和使用这种映射关系。 首先,我们要...
在Java持久化框架Hibernate中,一对多映射(One-to-Many Mapping)是数据库关系模型中常见的关联类型,它表示一个实体(如一个用户)可以与多个其他实体(如订单)相关联。在这个实例中,我们将深入探讨如何在...
本文将深入探讨 Hibernate 的简单搭建以及其中的一对多映射关系。 ## Hibernate 搭建 1. **环境配置**:首先,你需要在项目中引入Hibernate的依赖库,这通常通过Maven或Gradle来完成。添加相应的依赖项到pom.xml或...
首先,我们来理解一下一对多映射(One-to-Many Mapping)。在数据库设计中,一对多关系意味着一个父记录可以与多个子记录相关联。在Hibernate中,可以通过配置XML映射文件或使用注解来实现这种关系。例如,假设我们...
理解并熟练掌握Hibernate的多对多映射是开发企业级Java应用的重要技能。通过源码学习,你可以深入了解Hibernate如何处理多对多关系的细节,从而更好地应用到实际项目中。在实际编程时,注意合理设计实体关系,确保...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
在理解了一对多映射后,我们可以通过Hibernate API来处理这种关系: 1. 插入数据时,先创建父实体,然后在子实体中设置父实体的引用,最后保存子实体。Hibernate会自动处理外键的插入。 2. 查询时,可以从父实体...
在Hibernate中,可以通过以下方式实现一对多映射: 1. **配置文件映射**:在Hibernate的配置文件(如`hibernate.cfg.xml`)中,声明两个实体类对应的数据库表,并设置关联关系。 2. **实体类定义**:在Java实体类中...
- 如果一方是多的一方,则不能使用一对一映射,应使用一对多映射。 通过以上讲解,希望读者对Hibernate的一对一映射有了更深入的理解,并能在实际项目中灵活运用。一对一映射虽然不常见,但理解其原理和实现方式...
在博文《hibernate 多对一映射关联配置》中,作者可能详细阐述了如何配置这些属性,以及在实际项目中遇到的问题和解决方案。文档心得.doc可能包含了作者的个人经验,如优化查询效率、处理空值问题、避免级联操作带来...
本篇主要探讨的是Hibernate中的一对多关联映射,它允许一个实体对象对应数据库表中的多个行。在实际业务场景中,这种映射模式非常常见,例如一个用户可以拥有多个订单,一个部门可以包含多个员工等。 首先,我们来...
本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...
在关系型数据库中,常见的关联类型包括一对一、一对多、多对一以及多对多。本篇文章将深入探讨“Hibernate多对一映射”这一关键概念,并通过实例来阐述其工作原理。 ### 一、多对一映射概述 在数据库设计中,多对...
【hibernate 多对一映射】是关系数据库与对象模型之间的一种映射机制,是Hibernate框架中的一个重要概念。Hibernate作为一个优秀的Java持久化框架,它允许开发者将数据库操作转化为面向对象的操作,大大简化了数据库...