我的时区早上好。
技术: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)
}
}
在我的公司项目中,我正在对这段代码进行更改。 我的改变是方法的创建" getMethodTwo"和他的调用(3)。问题在于,在步伐(4)中,JPA引发了异常,因为对象有变化" f"通过EntityManager(1)加载,因此它附加到上下文,并且因为当我们调用executeUpdate(4)时有更改,JPA将尝试运行对象的更改的SQL语句" f"。在我的更改之前,这段代码有效,因为有一个finalize可以清除持久化上下文(5)。我认为这是一种糟糕的代码方式。我知道如果我在调用我的方法之前调用entitymanager.clear()它会起作用,但我认为这不是正确的解决方案和使用JPA的正确方法。我该怎么办?
祝你好运 提前致谢
答案 0 :(得分:1)
在调用更新之前,您应该将对象状态刷新到DB。
emanager.flush();
并在操作后刷新其状态
emanager.refresh(f)
答案 1 :(得分:0)
我使用注释TransactionAttributeType NOT_SUPPORTED修复了问题,因为该方法只生成SELECT语句。