2014-11-14 111 views
0

我正在面临与声音与对象缓存相关的休眠问题。休眠检索脏对象

详细描述问题,我有一个实体,我们称它为A,列表属性映射为@OneToMany(cascade=CascadeType.ALL, mappedBy="attribute")。列表中的对象是B类的实体,并与A具有双向关系。因此B具有指向A的属性,其映射为@OneToOne(cascade=CascadeType.MERGE)。我从数据库中获取对象A,并将新的对象B添加到A的列表中,并调用session.update(A)

问题出现时,我得到所有A对象调用session.createCriteria(A.class).list();,完全访问我更新的A对象和我添加的B对象不在列表中。

我试图在更新A后致电session.refresh(A),但问题仍然存在。

Anyboy是否知道如何处理它。

回答

0

你有一个@OneToMany(级联= CascadeType.ALL,mappedBy =“属性”)在A类映射到B元素和B你有@OneToOne(cascade = CascadeType.MERGE)元素=>它不相干。

你应该在类B的@ManyToOne

这里你可以看到一个例子:http://fruzenshtein.com/bidirectional-many-to-one-association/

如果你想添加一个新的B对象,你需要处理因为ID双向链接。

“我从数据库中获得对象A并添加一个新对象B”=> B有链接到A?如果不是双向连接不受尊重。

编辑:你可以在这里看到一些解释http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

“由于工作的关系是双向的,从而将应用程序更新的关系的一个侧面,对方也应该得到更新,并且在同步中。 JPA,就像Java中的一般情况一样,应用程序或对象模型负责维护关系,如果应用程序添加到关系的一侧,则它必须添加到另一侧。

+0

你说得对。 OneToMany取代了OneToOne,但问题仍然存在。 – 2014-11-14 17:29:34

+0

我已经完成答案 – rlm 2014-11-14 17:30:22

+0

谢谢你的答复,但问题仍然存在。 – 2014-11-14 18:11:30

0

由于您在实体AB之间存在双向关系,因此您还需要在Java代码中维护关系。

基于您的代码,让说:

A.java

@OneToMany(cascade=CascadeType.ALL, mappedBy="attribute") 
List<B> bObjs; 

B.java

@ManyToOne(cascade=CascadeType.MERGE) 
@JoinColumn 
A attribute; 

然后维持在Java代码中,你需要双方等来设定的关系这个:

a.setBObjs(listOfBs); 
b.setA(a); 

然后你可以调用session.update(a),这样hibernate就可以正确地保存实体。

+0

JoinColumn注释的使用权限是多少?如果不是的话,我在你的回复中显示了你的行为。 – 2014-11-14 19:02:30

+0

如果你删除JoinColumn,那么hibernate默认创建一个Join表,所以它不是强制性的。你能否显示你已经尝试过的确切代码,并将你的实体发布到问题上? – Chaitanya 2014-11-15 00:09:03