Hibernate锁机制
Hibernate提供了两种锁机制:悲观锁和乐观锁。
悲观锁和乐观锁的区别:
乐观锁 | 悲观锁 |
不管有多少线程同时访问同一条数据;给数据加上一个版本号;每次提交数据的时候对比 |
|
以乐观锁为例:
用部门表为例:
package com.msit.hibernate.entity; import java.util.Set; /** * 部门 * @author Administrator * 在部门的角度关系:一对多(一个部门多个员工)one-to-many */ public class Department { private int id; private String name; private int ver; private Set<Employee> emps;//员工集合 /** * @return the ver */ public int getVer() { return ver; } /** * @param ver the ver to set */ public void setVer(int ver) { this.ver = ver; } /** * @return the emps */ public Set<Employee> getEmps() { return emps; } /** * @param emps the emps to set */ public void setEmps(Set<Employee> emps) { this.emps = emps; } /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } }
Department.hbm映射
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.msit.hibernate.entity"> <!-- 对象 关系 映射 --> <class name="Department" table="t_department"> <id name="id"> <generator class="increment"/> </id> <!--必须在id节点下--> <version name="ver"/> <property name="name" /> <!-- lazy:是否采用延迟加载策略;默认值为true fetch:采用什么抓取策略;默认为逐条抓取select --> <set name="emps" cascade="all" > <key column="depart_id"></key><!-- 对应员工表中的外键 --> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>
测试类:
package com.msit.hibernate.lock; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import com.msit.hibernate.entity.Department; import com.msit.hibernate.tool.HibernateUtil; public class Lock { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub lock(); //add(); } static void lock(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Department dpt = (Department) session.get(Department.class, 2); dpt.setName("人事部"); System.out.println("数据版本1:"+dpt.getVer()); Session session2 = HibernateUtil.getSession(); Transaction tx2 = session2.beginTransaction(); Department dpt2 = (Department) session2.get(Department.class, 2); dpt2.setName("人事"); System.out.println("数据版本2:"+dpt2.getVer()); tx2.commit(); Department dpt3 = (Department) HibernateUtil.getSession().get(Department.class, 2); System.out.println("更新之后数据版本:"+dpt3.getVer()); tx.commit(); } static void add(){ try { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Department dpt = new Department(); dpt.setName("人事部"); session.save(dpt); tx.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: 2276292708@qq.com 如果需要转载,请注明出处,谢谢!!
责任重于泰山,任重而道远。