交易和分离对象JPA

时间:2015-04-01 09:56:54

标签: java jpa transactions entitymanager

我的时区早上好。

技术: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的正确方法。我该怎么办?

祝你好运 提前致谢

2 个答案:

答案 0 :(得分:1)

在调用更新之前,您应该将对象状态刷新到DB。

emanager.flush();

并在操作后刷新其状态

emanager.refresh(f)

答案 1 :(得分:0)

我使用注释TransactionAttributeType NOT_SUPPORTED修复了问题,因为该方法只生成SELECT语句。