0

我正在尝试更新实体列表。实际上我必须两次更新每个实体。首先我需要设置一些状态,然后执行一些操作来生成 pdf 报告,然后再次更新该实体的状态。我得到了这个 OptimisticLockException。此表未在系统中的其他任何地方更新。我不知道我在做什么错。

public void procesarImpresiones() {
    Query q = em.createNamedQuery("Gapendte.selectByState");


    for (Object p:q.getResultList()){
        Gapendte pend = (Gapendte) em.merge(p);

        pend.setKy1("2");

        em.flush();

        try{

            //print something to pdf
            ...

            pend.setKy1("9");
        }catch (Exception e) {
            pend.setKy1("7");
        }

        em.flush();
    }    
}

谢谢你的帮助!

4

3 回答 3

0

即使很难,我也没有解决方案,我确信这个问题被误导了。由于一些奇怪的编码不兼容而产生错误。它与锁无关(至少不是直接的),而是与存储在我试图更新的@id 字段中的某些数据有关。

于 2013-07-24T15:53:15.210 回答
0

刷新正在更新数据库中的实体版本。我认为新版本号会重新加载到当前实例中,但似乎不是。你应该尝试em.refresh(pend)在同花之后跟注。

于 2013-07-11T18:42:21.627 回答
0

如果您使用连接池之类的东西,您将需要重新配置锁或至少重新配置它们的时间。来自 JBoos 文档:“事务隔离通常通过锁定事务中访问的任何内容来实现。事务锁定有两种不同的方法:悲观锁定和乐观锁定。

悲观锁定的缺点是资源从在事务中第一次访问到事务完成时被锁定... ...使用乐观锁定,资源在第一次被访问时实际上并没有被锁定交易。相反,保存了使用悲观锁定方法锁定时的资源状态......”

所以你必须配置正确的锁定策略和时间,比如:

    EntityManager em = ...;
    Person person = ...;
    em.lock(person, LockModeType.OPTIMISTIC);

取自 java EE 6 文档http://docs.oracle.com/javaee/6/tutorial/doc/gkjiu.html

于 2013-07-11T19:31:54.907 回答