【发布时间】:2022-10-12 21:32:18
【问题描述】:
我有以下情况,到目前为止找不到任何解决方案。
想象一下下面的 Hibernate 模型,它包含 3 种不同类型的一对多关系:
public class A {
@Transient
private String someRuntimeData;
@OneToMany
private Set<B> collA;
@OneToMany
private Set<C> collB;
}
public class B {
@ManyToOne
private A parent;
}
public class C {
@ManyToOne
private A parent;
}
想象一下,数据库包含许多 B'c 和 C,它们可能与 A 有或可能没有父关系。我需要创建一个包含所有 B 和所有 C 的内存缓存,不幸的是,在涉及的不同位置有很多瞬态数据,这需要我禁止缓存同一父对象 A 的多个实例。
class SomeClass {
@Transactional
protected void init() {
bList = repoB.readAll();
cList = repoC.readAll();
}
}
问题是我不知道如何或是否有可能告诉 JPA/Hibernate 以下列方式保留和重用先前加载的实体的对象实例(及其标识):
加载 B 的完整集合及其可选的 A 父集合,然后加载 C 的完整集合,其中重用任何可传递加载的 A 实例(通过 B)。在适当的情况下,B 和 C 实例都指向同一个内存对象。
如果有人能在我吞下苦果并手动重新映射所有内容之前解释如何使用 JPA/Hibernate 的开箱即用功能来实现这一点,我将非常感激。
先感谢您!
【问题讨论】:
-
基本上,这就是在单个事务中发生的事情。
-
这就是我的想法,并且我注释了包含对 B 和 C 的 JPA readAll() 调用的方法,但是相同的父对象具有不同的对象身份。 Spring 是否会通过错误或警告告诉我事务上下文实际上并未应用于该方法,或者只是默默地失败?
-
您使用
@Transactional注释了 readAll() 或包含此方法的类? -
@Mihe我添加了一个额外的代码sn-p regrding“@Transactional”部分。
-
您可以尝试调试它,例如。 G。 this answer 可能会有所帮助。
标签: java hibernate jpa object-identity