Hibernate检索脏对象

时间:2014-11-14 16:12:51

标签: java hibernate

我遇到的hibernate问题听起来与对象缓存有关。

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

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

我尝试在更新A后调用session.refresh(A),但问题仍然存在。

anyboy是否知道如何处理它。

2 个答案:

答案 0 :(得分:0)

您在A类上有@OneToMany(cascade = CascadeType.ALL,mappedBy ="属性")以映射到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一样,应用程序或对象模型负责维护关系。如果您的应用程序添加到关系的一方,那么它必须添加到另一方。"

答案 1 :(得分: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就能正确保存实体。