【发布时间】:2012-05-17 17:34:17
【问题描述】:
我有一些简单的实体 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() 上?
谢谢。
【问题讨论】:
-
就像评论一样,我在从缓存中检索它之后尝试 .merge(country) ,但它并没有真正起作用,JPA 仍然尝试将简单 bean 作为事务的一部分进行持久化(上面的最后一行代码)。无论如何,我不需要合并这些简单的 bean,我只是希望它们不要作为新记录保留在数据库中,因为它们已经存在。
-
与原始问题无关,您是否考虑过使用
Country的外键而不是在Customer中设置它然后合并。我想你在创建客户之前会有国家对象。 -
嗨 Nayan,我不太明白你的建议。需要详细说明吗?
-
类似
customer.setCountryId(country.getId()),不包括整个国家对象,但它的参考完整性的主键。 -
您好,是的,这可行。但是,如果无法完成简单的事情(我在问自己),那么所有这些 JPA 复杂性的意义何在? :)