我有一个简单的简单实体bean(EJB 3.1,Glassfish,EclipseLink)的应用程序内缓存,因此每次都需要快速查找,因此我不必每次都使用findById在数据库中查找它们。这些实体bean是只读的。
因此,例如,实体bean国家或货币位于本地缓存中。
Java EE应用程序中的某些进程希望更新复杂的实体bean(即Customer),它使用上面的简单bean(Country,Currency ...)。
然后会发生这样的情况,因为简单实体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)本身,以便它不会尝试在.merge()上保存依赖对象(Country)?
谢谢。
答案 0 :(得分:1)
在将其设置为Customer之前,您应该在国家/地区执行find()或merge()。另外,请确保其具有正确的ID。
合并客户也应该工作,如果它的Id存在,它会尝试插入国家,这很奇怪,但这可能取决于你如何配置东西。您是否在国家关系中级联合并?
请注意,EclipseLink有自己的缓存。因此,可能不需要您的应用程序缓存。