Hibernate中session.lock方法的目的是什么?

时间:2011-11-13 17:24:44

标签: hibernate

我正在经历hibernate的lock method。我没有得到我们想要通过这种方法实现的目标。

 p1  = (Person)session. get(Person.class,1);// person name is scott here
// here peson name got update to henry by anothet thread
session. lock(person, LockMode.READ) line 3
// still name is henry too

我尝试了上面的代码片段,但它没有从第3行的数据库中读取此人。 文档说这可能用于执行版本检查。

不确定如何在任何情况下检查版本并帮助开发人员?

同样不确定session.lock(person, LockMode.None)会实现什么。文档说LockMode.NONE用于简单地将瞬态实例与会话重新关联。

不确定将临时实例与会话重新关联是什么意思。一个简短的场景会有很大的帮助吗?

1 个答案:

答案 0 :(得分:12)

不同的锁定模式用于防止实体同时被修改和从多个源读取,有关详细信息,请参阅有关pessimistic locking的文档条目。根据我的经验,这些很少需要,因为数据库隔离级别通常会根据需要进行锁定:

  

用户并不打算花太多时间担心锁定问题   策略。通常足以指定隔离级别   JDBC连接然后简单地让数据库完成所有工作。   但是,高级用户可能希望获得独占的悲观锁   或者在新交易开始时重新获得锁定。

至于“将一个瞬态实例与会话重新关联”(我实际上认为它们是指分离的实例?),请考虑以下图片(Hibernate entity lifecycle):

Hibernate entity lifecycle

这是Hibernate community documentation的描述:

  

Hibernate定义并支持以下对象状态:

     
      
  • 瞬态 - 如果对象刚刚被实例化,则它是瞬态的   使用new运算符,它与Hibernate无关   会话。它在数据库中没有持久表示,没有   标识符值已分配。瞬态实例将是   如果应用程序没有保存,则由垃圾收集器销毁   再参考一下。使用Hibernate Session创建一个对象   持久化(让Hibernate处理那些SQL语句   需要为此过渡执行)。
  •   
  • 坚持 - 持久   instance在数据库中有一个表示和一个标识符值。   它可能刚刚被保存或加载,但是,根据定义   在会话范围内。 Hibernate将检测所做的任何更改   处于持久状态的对象并将状态与   工作单元完成时的数据库。开发人员不执行   手动UPDATE语句,或对象应该的DELETE语句   变得短暂。
  •   
  • 分离 - 分离的实例是一个对象   一直坚持,但其会议已经结束。引用   当然,该对象仍然有效,并且分离的实例可能   甚至在这种状态下进行修改。可以重新附加分离的实例   以后的新会议,制作它(和所有的   修改)再次坚持。此功能可实现编程   需要用户思考的长期工作单元的模型。我们   称他们为应用程序交易,即来自的工作单位   用户的观点。
  •