【发布时间】:2015-06-05 22:07:30
【问题描述】:
在我的时区早上好。
技术:EJB 3.0 JPA 提供者 ->(openjpa) 容器 -> WAS 代码片段:
@Stateless(name = "ejb/BeanName")
public class A implements AInterface{
@PersistenceContext(unitName = "main")
private EntityManager emanager;
public String getData(D d){
try{
C c = new C();
F f = emanager.find(F.class,d.getId());(1)
f.setSomeData(c);(2)
getMethodTwo(d,f);(3)
}finally{
emanager.clear();(5)
}
}
public String getMethodTwo(D d,F f){
Query q = emanager.createNativeQuery("UPDATE ...");
q.executeUpdate();(4)
}
}
在我的公司项目中,我正在更改此 sn-p 代码。 我的更改是创建方法“getMethodTwo”和他的调用(3)。问题是在速度(4)中,JPA 抛出异常,因为通过 EntityManager(1)加载的对象“f”发生了变化,所以它附加到上下文中,并且因为当我们调用 executeUpdate(4) 时发生更改,JPA 将尝试运行对象“f”上更改的 SQL 语句。在我的更改之前,此代码有效,因为有是清除持久性上下文的最终确定(5)。我认为这是一种糟糕的代码方式。我知道如果我在调用我的方法之前调用 entitymanager.clear() 它将起作用,但我认为这不是正确的解决方案和使用 JPA 的正确方法。我该怎么办?
最好的问候 提前致谢
【问题讨论】:
标签: java jpa transactions entitymanager