首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate 乐观所施用

2013-03-16 
hibernate 乐观所使用package Versionpublic class Student {private String idprivate String namepri

hibernate 乐观所使用
package Version;public class Student { private String id; private String name; private int version;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getVersion() {return version;}public void setVersion(int version) {this.version = version;}}

2 实体配置文件 ?Student.hbm.xml

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--     Mapping file autogenerated by MyEclipse - Hibernate Tools--><hibernate-mapping><class name="Version.Student" table="studentVersion" optimistic-lock="version"  >    <id name="id" unsaved-value="null">      <generator column="ver" type="int"></version>    <property name="name" type="string" column="name"></property>  </class></hibernate-mapping>

?

3 ?hbernate.cfg.xml 主配置文件

?

??

<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   --><hibernate-configuration><session-factory>    <property name="connection.username">root</property>    <property name="connection.url">        jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312&amp;useUnicode=true    </property>    <property name="dialect">        org.hibernate.dialect.MySQLDialect    </property>    <property name="myeclipse.connection.profile">mysql</property>    <property name="connection.password">1234</property>    <property name="connection.driver_class">        com.mysql.jdbc.Driver    </property>    <property name="hibernate.show_sql">true</property>    <property name="current_session_context_class">thread</property>    <property name="jdbc.batch_size">15</property>    <mapping resource="Version/Student.hbm.xml" /></session-factory></hibernate-configuration>

? ?

4 hibernage 的测试代码

import java.io.File;import java.util.Iterator;import java.util.Set;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class Test {    public static void main(String[] args) {        String filePath=System.getProperty("user.dir")+File.separator+"src/Version"+File.separator+"hibernate.cfg.xml";        File file=new File(filePath);        System.out.println(filePath);        SessionFactory sessionFactory=new Configuration().configure(file).buildSessionFactory();        Session session=sessionFactory.openSession();        Transaction t=session.beginTransaction();                Student stu=new Student();        stu.setName("tom11");        session.save(stu);        t.commit();                /*         * 模拟多个session操作student数据表         */                Session session1=sessionFactory.openSession();        Session session2=sessionFactory.openSession();        Student stu1=(Student)session1.createQuery("from Student s where s.name='tom11'").uniqueResult();        Student stu2=(Student)session2.createQuery("from Student s where s.name='tom11'").uniqueResult();                //这时候,两个版本号是相同的        System.out.println("v1="+stu1.getVersion()+"--v2="+stu2.getVersion());                Transaction tx1=session1.beginTransaction();        stu1.setName("session1");        tx1.commit();        //这时候,两个版本号是不同的,其中一个的版本号递增了        System.out.println("v1="+stu1.getVersion()+"--v2="+stu2.getVersion());                Transaction tx2=session2.beginTransaction();        stu2.setName("session2");        tx2.commit();                 }}

?

运行结果:

Hibernate: insert into studentVersion (ver, name, id) values (?, ?, ?)

Hibernate: select student0_.id as id0_, student0_.ver as ver0_, student0_.name as name0_ from studentVersion student0_ where student0_.name='tom11'

Hibernate: select student0_.id as id0_, student0_.ver as ver0_, student0_.name as name0_ from studentVersion student0_ where student0_.name='tom11'

v1=0--v2=0

Hibernate: update studentVersion set ver=?, name=? where id=? and ver=?

v1=1--v2=0

Hibernate: update studentVersion set ver=?, name=? where id=? and ver=?

Exception in thread "main" org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Version.Student#4028818316cd6b460116cd6b50830001]

?

可以看到,第二个“用户”session2修改数据时候,记录的版本号已经被session1更新过了,所以抛出了红色的异常,我们可以在实际应用中处理这个异常,例如在处理中重新读取数据库中的数据,同时将目前的数据与数据库中的数据展示出来,让使用者有机会比较一下,或者设计程序自动读取新的数据

?

注意:如果手工设置stu.setVersion()自行更新版本以跳过检查,则这种乐观锁就会失效,应对方法可以将Student.java的setVersion设置成private

?

?

?

?

?

?

热点排行