如何在JPA下解锁一个实体

时间:2013-06-07 03:25:57

标签: jpa

所有

我正在使用纯JPA编写程序,其提供程序是hibernate,底层数据库是Azure SQL DB。该程序将在分布式环境下运行,其中许多副本将在不同的服务器上运行。

我需要去做一些这样的程序(对于ex-):
  1,锁定指定的学生实体,
  2,检查clas实体的状态,如果状态为1,则继续,否则,尝试锁定此类实体,untile获取此类的锁定
  3,检查状态的状态(可能由于分布式环境而被其他服务器的其他线程修改),如果仍然不是1,则执行某些操作,将状态修改为1,
  4,解锁此类实体
  5,做其他事情(仍然锁定当前学生实体)

我通过以下代码获取锁定:

    Map<String,Object> map = new HashMap<String, Object>();
    map.put("javax.persistence.lock.timeout", 0);
    return this.getEntityManager().find( cls, id,  LockModeType.PESSIMISTIC_WRITE,map);

但是,我不知道如何在第4步重新发布锁, 是否有任何方法可以实现对实体的锁定,并保留其他锁定?

非常感谢,任何建议都会被挪用。

1 个答案:

答案 0 :(得分:3)

您必须将锁定模式设置为无

  em.lock(myEntity, LockModeType.NONE);

请参阅http://www.objectdb.com/java/jpa/persistence/lock