【问题标题】:Transactions and detach objects JPA事务和分离对象 JPA
【发布时间】: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


    【解决方案1】:

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

    emanager.flush();
    

    并在操作后刷新其状态

    emanager.refresh(f)
    

    【讨论】:

    • 感谢您的回答,但问题是如果我“刷新”对“f”对象所做的更改将通过 SQL 语句(UPDATE AND INSERT)和“f”发送到数据库object 还没有准备好在语句中使用,因为所需的字段没有全部填满,并且会抛出 CONSTRAINT NULL 异常。关键是要避免 FLUSH。
    【解决方案2】:

    我使用注解 TransactionAttributeType NOT_SUPPORTED 解决了这个问题,因为该方法只是进行 SELECT 语句。

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2013-07-01
      • 1970-01-01
      相关资源
      最近更新 更多