Java 休眠:刷新多对一的父级

Java 休眠:刷新多对一的父级,java,hibernate,ehcache,Java,Hibernate,Ehcache,我有两个类:Parent和Child,将一个类映射到多个类,关系由Child所有。我还将二级缓存与Ehcache一起使用 为了保持这种关系,我做了以下几点: child.setParent(parent); session.saveOrUpdate(child); parent.getChildren().add(child); 当我在另一个会话(从二级缓存)中加载父级时,新添加的子级是否可见?在这种情况下,刷新父级集合的正确方法是什么 对于有具体解释或文档链接的答案,而不是“对我来说似乎很好

我有两个类:
Parent
Child
,将一个类映射到多个类,关系由
Child
所有。我还将二级缓存与Ehcache一起使用

为了保持这种关系,我做了以下几点:

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

对于有具体解释或文档链接的答案,而不是“对我来说似乎很好,是的”,可以加分

需要明确的是:所有事情都发生在正确提交的事务中。主要问题是:对于此
会话
和二级缓存中的其他会话
而言,这是刷新
父项.子项
的正确方法吗?


另一点:在回滚时,我应该如何从二级缓存中移出此类集合?

您使用什么类型的缓存

这个序列对我来说很好:

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

另外,请确保您确实需要该缓存。根据我的经验,2级缓存很少加速实际应用程序,但却会产生很多问题。

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

我引述

在非托管上下文中:

您不必刷新()会话 显式:对commit()的调用 自动触发 同步取决于 会话的刷新模式。调用 close()标记会话的结束。 close()的主要含义是 JDBC连接将是 由会话放弃。此Java 代码是可移植的,可以在两种环境中运行 非托管和JTA环境


如果您使用的是即时加载,它将可见

对于延迟加载,您需要对其进行初始化:

Parent p = em.find(Parent.class, 1);
Hibernate.initialize(p);
System.out.println(p.child);

可以找到有关它的详细信息。

这取决于您为此parent.children集合选择的缓存策略(只读、非严格读写…)。如果它不是只读的,并且子对象的持久化操作正确,hibernate将从二级缓存中逐出集合。

它是复制的Ehcache。不确定您所说的类型。如果我在一分钟后在另一个服务器上的另一个会话中从二级缓存加载实体,您的解决方案会起作用吗?
Parent p = em.find(Parent.class, 1);
Hibernate.initialize(p);
System.out.println(p.child);