现有主表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一对多映射
一个老师可以教多个学生 【一对多映射】 多个学生可以被一个老师教【多对一映射】 部门与员工: 一个部门有多个员工【一对多映射】 多个员工属于一个部门【多对一映射】 1.2:多对多,举例说明: 项目和开发员工:...
hibernate基于 一对多、多对一映射写的一个增加,查询,删除,修改的demo,内附数据库脚本
hibernate一对多映射实例,包换数据库建表代码
Hibernate一对多映射配置详解,很值得借鉴
hibernate的简单搭建、hibernate的一对多映射关系
Hibernate一对多,多对一映射
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
这个例子会让你很快懂得hibernate一对多的映射机制,你看了以后会有很大的感触!
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
hibernate 多对一映射 适合初学者
hibernate多对一映射(XML)版
hibernate一对多映射源代码 希望大家可以顶一下。。
Hibernate多对一映射(注解版)
Hibernate多对一映射实例,里面包含源程序,测试程序,映射说明
Hibernate双向一对一关联映射(注解版)
Hibernate映射一对多关联关系
hibernate关联映射详解SSH 多对多,一对多关系对象映射