1

我有一些简单的实体 bean(EJB 3.1、Glassfish、EclipseLink)的应用程序内缓存,因此我不必每次都使用 findById 在数据库中查找它们,因为应用程序需要快速。这些实体 bean 是只读的。

因此,例如实体 bean Country 或 Currency 位于本地缓存中。

Java EE 应用程序中的某些进程希望更新复杂的实体 bean(即客户),它使用上面的简单 bean(国家、货币...)。

然后发生的情况是,由于简单实体 bean 与 JPA 上下文的连接丢失,当在 Customer bean 上尝试 .merge() 时,JPA 希望将简单实体 bean 作为新记录保存在数据库中,尽管这些记录存在数据库中已经 100%,所以我猜这是一个“分离实体”问题。

例子。

Country country = getFromCacheByName("GB"); // detached entity, but exists in database
Customer customer = getCustomerFromJPA(); // existing JPA attached entity
customer.setCountry(country);
EntityManager.merge(customer); // pseudo code

如何修复最后一行或 bean (Customer) 本身,以便它不会尝试将依赖对象 (Country) 保存在 .merge() 上?

谢谢你。

4

1 回答 1

1

在将其设置在客户中之前,您应该在国家/地区执行 find() 或 merge()。此外,请确保它具有正确的 ID。

Merge on Customer 也应该可以工作,如果它的 Id 存在,它会尝试插入国家,这很奇怪,但这可能取决于您如何配置事物。您是否正在对国家关系进行级联合并?

请注意,EclipseLink 有自己的缓存。因此,您的应用程序缓存可能不需要。

于 2012-05-09T14:51:32.467 回答