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

M S*_*ach 11 hibernate

我正在通过hibernate的锁定方法.我没有得到我们想要通过这种方法实现的目标.

 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

esa*_*saj 12

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

用户并不打算花太多时间担心锁定策略.通常,为JDBC连接指定隔离级别,然后让数据库完成所有工作.但是,高级用户可能希望在新事务开始时获得独占的悲观锁或重新获取锁.

至于"与会话重新关联瞬态实例"(我实际上认为它们意味着分离的实例?),请考虑以下图片(Hibernate实体生命周期):

Hibernate实体生命周期

这是Hibernate社区文档的描述:

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

  • 瞬态 - 如果一个对象刚刚使用new运算符进行实例化,并且它与Hibernate会话无关,则该对象是瞬态的.它在数据库中没有持久表示,并且没有分配标识符值.如果应用程序不再持有引用,则垃圾收集器将销毁瞬态实例.使用Hibernate Session使对象持久化(让Hibernate处理需要为此转换执行的SQL语句).
  • 持久性 - 持久性实例在数据库中具有表示形式和标识符值.它可能刚刚被保存或加载,但是,它定义在Session的范围内.Hibernate将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步.当对象应该是瞬态的时,开发人员不会执行手动UPDATE语句或DELETE语句.
  • 已分离 - 已分离的实例是一个持久的对象,但其会话已关闭.当然,对对象的引用仍然有效,甚至可以在此状态下修改分离的实例.可以在稍后的时间点将分离的实例重新附加到新的会话,使其(以及所有修改)再次持久化.此功能为需要用户思考的长时间运行工作单元启用编程模型.我们称之为应用程序事务,即从用户的角度来看工作单元.