日期:2014-05-20  浏览次数:20753 次

《理论导致现实》之 Hibernate 错误 ~
这两天,我在实践Hibernate的过程中发现了些许或是许许些问题。有的问题没解决,有的问题也没解决。 -_-!!

下面我就来说下,我今天稍早时碰到的一个问题。

(以下代码是我从机器中Copy过来的不完全代码。全部pojo的xml就懒得Copy了,只把主要的部分Copy了过来)

问题如下:
当对 one-to-many 端的一个 "SET集合" 进行操作时,

例如:
Group group = session.load(Group.class,"402881311c98ff57011c98ff58ef0001")
User user = new User();
//user ID 由 hibernate自动分配
user.setName("小鸡鸡");
group.getUsers().add(user);
session.save(group);
//提交数据....

下面,我就阐述一下上面的过程。
如果one-to-many端设置了
“级联(比如: cascade=all)” 并且将“inverse=false” (即:对Set集合的操作 “会”被反映到数据库中!)
此时,当执行“数据提交”的时候 Hibernate会根据“级联关系(cascade=all)”往数据库中insert一条记录。
如: insert into test.user (id, name, group_id) values (?, ?, ?)然后,“又”由于insvert=false,所以又出现了如下一条update语句
如: update test.user set group_id=? where id=?
//-----------------------//
之后,而当,我把 one-to-many中有关,级联属性关系去掉。(即: cascade=none )时,在提交数据的时候 "控制台console"
就会少出现一条 HQL 语句。
那条没有出现的HQL语句,就是“insert”语句 【即: insert into test.user (id, name, group_id) values (?, ?, ?)】
而那条update语句仍然会出现。但是在update语句后面随之而来的却是一连串的Exception。(也就是说这条数据还没有insert,就要对这条数据进行update啦~)

所以我猜测,是不是Hibernate在对“Set集合”进行 "添加操作"的时候。(例:group.getUsers().add(user))
Hibernate只会对其进行 update ,而如果没有设置级联关系(cascade),就只会出现上面的那种情况。是么?

请问?我上面的推断是否有误?如果有错误的话,请诸位帮忙纠正一下。多谢大家啦~

如果我上面的陈述是正确的。那请问: Hibernate为什么只会对其update不会对其insert呢?其深层还以是什么呢?

------解决方案--------------------
探讨
引用:
设置cascade=none :即group保存后不会将其拥有的user保存到数据库,但由于在group端设置了inverse=false它依然会维护关系,所以会 update user对应的表,将原来为空的外键更新上去,建议在group端设置inverse=true,由user维护关系,这样会减少一条update语句。


其实我上面那种做法,只是想看看Hibernate在这种情况下的做法。(测试)

请问,对于inverse=false的时候,Hibernate要维…