我正在经历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
用于简单地将瞬态实例与会话重新关联。
不确定将临时实例与会话重新关联是什么意思。一个简短的场景会有很大的帮助吗?
答案 0 :(得分:12)
不同的锁定模式用于防止实体同时被修改和从多个源读取,有关详细信息,请参阅有关pessimistic locking的文档条目。根据我的经验,这些很少需要,因为数据库隔离级别通常会根据需要进行锁定:
用户并不打算花太多时间担心锁定问题 策略。通常足以指定隔离级别 JDBC连接然后简单地让数据库完成所有工作。 但是,高级用户可能希望获得独占的悲观锁 或者在新交易开始时重新获得锁定。
至于“将一个瞬态实例与会话重新关联”(我实际上认为它们是指分离的实例?),请考虑以下图片(Hibernate entity lifecycle):
这是Hibernate community documentation的描述:
Hibernate定义并支持以下对象状态:
- 瞬态 - 如果对象刚刚被实例化,则它是瞬态的 使用new运算符,它与Hibernate无关 会话。它在数据库中没有持久表示,没有 标识符值已分配。瞬态实例将是 如果应用程序没有保存,则由垃圾收集器销毁 再参考一下。使用Hibernate Session创建一个对象 持久化(让Hibernate处理那些SQL语句 需要为此过渡执行)。
- 坚持 - 持久 instance在数据库中有一个表示和一个标识符值。 它可能刚刚被保存或加载,但是,根据定义 在会话范围内。 Hibernate将检测所做的任何更改 处于持久状态的对象并将状态与 工作单元完成时的数据库。开发人员不执行 手动UPDATE语句,或对象应该的DELETE语句 变得短暂。
- 分离 - 分离的实例是一个对象 一直坚持,但其会议已经结束。引用 当然,该对象仍然有效,并且分离的实例可能 甚至在这种状态下进行修改。可以重新附加分离的实例 以后的新会议,制作它(和所有的 修改)再次坚持。此功能可实现编程 需要用户思考的长期工作单元的模型。我们 称他们为应用程序交易,即来自的工作单位 用户的观点。