快速业务通道

hibernate3学习笔记(二十三)|进阶特性(一) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
teger(31)); tx1.commit(); // 此时由於资料更新,资料库中的版本号递增了 // 两笔资料版本号不一样了 System.out.println(" v1 v2 "          + userV1.getVersion().intValue() + " "          + userV2.getVersion().intValue()); // userV2 的 age 资料还是旧的 // 资料更新 userV2.setName("justin"); // 因版本号比资料库中的旧 // 送出更新资料会失败,丢出StableObjectStateException例外 tx2.commit(); session1.close(); session2.close();

hibernate3学习笔记(二十三)|进阶特性(一)(4)

时间:2011-02-03

运行以下的程式片段,会出现以下的结果:

Hibernate: select user0_.id as id0_, user0_.version as version0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from user user0_ where user0_.id=? Hibernate: select user0_.id as id0_, user0_.version as version0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from user user0_ where user0_.id=? v1 v2 0 0 Hibernate: update user set version=?, name=?, age=? where id=? and version=? v1 v2 1 0 Hibernate: update user set version=?, name=?, age=? where id=? and version=? 16:11:43,187 ERROR AbstractFlushingEventListener:277 - Could not synchronize database state with session org.hibernate.StaleObjectStateException:   Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [onlyfun.caterpillar.User#1]   at org.hibernate.persister.entity.BasicEntityPersister.check(BasicEntityPersister.java:1441)

由於新的版本号是1,而userV2的版本号还是0,因此更新失败丢出StableObjectStateException,您可以捕捉这个例外作善後处理,例如在处理中重新读取资料库中的资料,同时将目前的资料与资料库中的资料秀出来,让使用者有机会比对不一致的资料,以决定要变更的部份,或者您可以 设计程式自动读取新的资料,并比对真正要更新的资料,这一切可以在背景执行,而不用让您的使用者知道。

要注意的是,由於乐观锁定是使用系统中的程式来控制,而不是使用资料库中的锁定机制,因而如果有人特意自行更新版本讯息来越过检查,则锁定机制就会无效, 例如在上例中自行更改userV2的version属性,使之与资料库中的版本号相同的话就不会有错误,像这样版本号被更改,或是由於资料是由外部系统而来,因而版本资讯不受控制时,锁定机制将会有问题,设计时必须注意。

3.Lifecycle 介面、Validatable 介面:

可以在实体物件定义时实作Lifecycle介面,这个介面定义如下:

Lifecycle.java package org.hibernate.classic; import java.io.Serializable; import org.hibernate.CallbackException; import org.hibernate.Session; public interface Lifecycle {    public static final boolean VETO = true;    public static final boolean NO_VETO = false;    public boolean onSave(Session s) throws CallbackException;    public boolean onUpdate(Session s) throws CallbackException;    public boolean onDelete(Session s) throws CallbackException;    public void onLoad(Session s, Serializable id); }

当物件实作Lifecycle介面时,会在save()、update()、delete()、load()等方法执行之前呼叫对应的onSave()、 onUpdate()、onDelete()与onLoad(),其中onSave()、onUpdate()、onDelete()与onLoad() 若传回true或丢出CallbackException,则对应的操作中止。

可以在实体物件定义时实作Va

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号