多对一关联关系,一方被删除,多方加载数据不一致的有关问题
多对一关联关系,一方被删除,多方加载数据不一致的问题
一个典型的应用系统,其中主要的实体(例如Account)一般都有createdUser和lastModifiedUser这样的字段,用以跟踪该实体被那个用户创建和最后修改,我们用hibernate处理这个关系的时候一般是在实体端用一个多对一的单项关联来引用User
如果系统某个用户被删除,这时候会有一个问题:
1. 实体引用的User的这两个字段已经不存在,hibernate再加载这个实体时就会报引用实体不存在的异常。
这个问题的一个解决办法是在many-to-one映射中加入not-found="ignore",这样就不会报异常了,但引入了另一个问题:
2.加载实体的时候,不管关联的createdUser和lastModifiedUser存不存在,hibernate都会自动发送一条sql去探测该对象存不存在,这样就多发送了两条sql,如果是列表加载50条记录,就要多发送2×50条sql,严重影响了性能。
请各位支支招,该类问题如何解决。
你自己可以选择需不需要加载`或只放id里面``没有必要每次去加载,如果这些问题没有处理好`,建议你别用hibernate,小心客户骂人
一个典型的应用系统,其中主要的实体(例如Account)一般都有createdUser和lastModifiedUser这样的字段,用以跟踪该实体被那个用户创建和最后修改,我们用hibernate处理这个关系的时候一般是在实体端用一个多对一的单项关联来引用User
<many-to-one class="User" name="createdUser" column="created_user"/> <many-to-one class="User" name="lastModifiedUser" column="last_modified_user"/>
如果系统某个用户被删除,这时候会有一个问题:
1. 实体引用的User的这两个字段已经不存在,hibernate再加载这个实体时就会报引用实体不存在的异常。
这个问题的一个解决办法是在many-to-one映射中加入not-found="ignore",这样就不会报异常了,但引入了另一个问题:
2.加载实体的时候,不管关联的createdUser和lastModifiedUser存不存在,hibernate都会自动发送一条sql去探测该对象存不存在,这样就多发送了两条sql,如果是列表加载50条记录,就要多发送2×50条sql,严重影响了性能。
请各位支支招,该类问题如何解决。
1 楼
ice123456
2007-12-24
这根本不是问题。当你删除一个用户的时候,应该自然去删除于它相关的数据
2 楼
ice123456
2007-12-24
terryyang 写道
加载实体,不管关联的createdUser和lastModifiedUser存不存在,hibernate都会自动发送一条sql去探测该对象存不存在,这样就多发送了两条sql,如果是列表加载50条记录,就要多发送2×50条sql,严重影响了性能。[/b]
请各位支支招,该类问题如何解决。
请各位支支招,该类问题如何解决。
你自己可以选择需不需要加载`或只放id里面``没有必要每次去加载,如果这些问题没有处理好`,建议你别用hibernate,小心客户骂人
3 楼
evanerv0079
2008-01-20
在hbm和模型中删除相应字段不就行了吗
4 楼
泡泡
2008-01-22
被FK约束了的,怎么Delete得掉?
5 楼
zjian0573
2008-01-24
我也遇到了一样的问题 参考夏昕的hibernate开发手册
解决方法是
方法1、在映射文件中手动去删除关联的外健。
方法2、改成双向关联,即在关联方“many to one”的"one"一方增加一个"one to many"。
方法1简单,但是每次ant之后要去手动改, 方法2 又是多了一步代码的编写,意味着关联方要多封装一个属性,就像lz的例子中,user对象中还要增加一个account对象的集合,增加一个"one to many"映射。
所以又没有什么折中的办法呢?
解决方法是
方法1、在映射文件中手动去删除关联的外健。
方法2、改成双向关联,即在关联方“many to one”的"one"一方增加一个"one to many"。
方法1简单,但是每次ant之后要去手动改, 方法2 又是多了一步代码的编写,意味着关联方要多封装一个属性,就像lz的例子中,user对象中还要增加一个account对象的集合,增加一个"one to many"映射。
所以又没有什么折中的办法呢?
6 楼
fb777
2008-01-24
=.= 删除客户的时候为什么不把关联删除