【问题标题】:LockMode in EJB3 Persistence NamedQueryEJB3 持久化 NamedQuery 中的 LockMode
【发布时间】:2011-12-11 22:47:40
【问题描述】:

我们如何在 EJB3 Persistence NamedQuery 中指定 LockMode?我想将悲观锁定模式添加到我现有的选择中,以便我可以在必要时进行更新,但令人惊讶的是查询对象没有 setLockMode(xxx) 方法(我的理解是如果 JPA,EJB3 持久性的子集,公开 setLockMode,EJB3 持久性应该有可用的方法也)。

Query query = em.createNamedQuery("findOptoutStudent");
query.setParameter("optoutIndicator", optoutIndicator);
List<Student> students = query.getResultList();
return students.get(0);

我假设我不必手动将查询更改为“选择更新”。

谢谢 凯文

【问题讨论】:

    标签: persistence ejb-3.0 named-query pessimistic-locking


    【解决方案1】:

    悲观锁定模式:

    • PESSIMISTIC_READ 表示共享锁。当另一个实体管理器获取PESSIMISTIC_WRITE 时,锁定请求失败。

    • PESSIMISTIC_WRITE 表示排他锁。当另一个实体管理器获得对象上的任一锁时,锁请求失败。

    在对象上应用锁

    entityManager.lock(object, LockModeType.PESSIMISTIC_READ)
    

    之后释放锁

    entityManager.lock(object, LockModeType.NONE)
    

    【讨论】:

    • 我可以对 NamedQuery 检索到的对象应用锁吗?还是必须是 em.find 返回的对象?我有类似的东西: Query query = em.createNamedQuery("findRecords"); query.setParameter("incomingInd", incomingInd); query.getResultList().get(0);
    • 是的,您可以通过可选元素将锁定模式应用于 NamedQuery - 定义中的“lockMode”。
    • 这个需要的版本是JPA 2.0,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多