Hibernate:刷新多对一的父级

Kon*_*rus 5 java hibernate ehcache

我有两个类:ParentChild映射一对多的关系所拥有的Child.我也在使用Ehcache的二级缓存.

为了坚持这种关系,我这样做:

child.setParent(parent);
session.saveOrUpdate(child);
parent.getChildren().add(child);
Run Code Online (Sandbox Code Playgroud)

当我加载parent另一个会话(从二级缓存)时,这个新添加的child是否可见?在这种情况下刷新父集合的正确方法是什么?

对于具有一些具体解释或链接到文档的答案的奖励积分,而不是"对我来说似乎很好,是的".

要明确:一切都发生在正确提交的事务中.主要问题是:这是parent.children为这个Session和第二级缓存中的其他人刷新的正确方法吗?

另一点:如何在回滚时从二级缓存中驱逐此类集合?

Dan*_*iar 0

在我看来,这是因为数据库隔离的本质,未提交的事物不应该对其他数据库连接可见(在 Hibernate 语言中,未提交的事物不应该对其他 Hibernate 会话可见)。要在其他 Hibernate 会话中可见,您需要做的是提交事务(在 Hibernate 语言中,提交 Hibernate 会话)。

Transaction tx = session.beginTransaction()

child.setParent(parent);
session.saveOrUpdate(child);
parent.getChildren().add(child);

tx.commit()
Run Code Online (Sandbox Code Playgroud)

我引用这个文档网站

在非托管环境中:

您不必显式地刷新会话:对 commit() 的调用会根据会话的 FlushMode 自动触发同步。对 close() 的调用标志着会话的结束。close() 的主要含义是会话将放弃 JDBC 连接。该 Java 代码是可移植的,并且可以在非托管环境和 JTA 环境中运行。