hibernate樂觀鎖例子
阿新 • • 發佈:2019-02-03
1.在資料表中新建一個version欄位,可以是int或者是bigint
2.在javabean中增加個version欄位
package net.spring.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Version; @Entity @Table(name = "t_concurrency") public class Concurrency { @Id private int id; @Version private int version; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } @Column private int count; public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } }
3.dao
@Transactional(rollbackFor = RuntimeException.class,timeout=10) @Override public void subtract(int id) { Session session = null; try { session = this.getHibernateTemplate().getSessionFactory().getCurrentSession(); Query query = session.createQuery("from Concurrency as u where u.id = '" + id + "'"); Concurrency c = new Concurrency(); c = (Concurrency) query.uniqueResult(); if (c.getCount() > 0) { //第一種不行的,沒有被hibernate管理,hibernate三種狀態符合才行,直接hql更新樂觀鎖不起效 //SQLQuery sqlQuery = session.createSQLQuery("update t_concurrency set count=count-1 where id = '"+ id + "'"); //sqlQuery.executeUpdate(); c.setCount(c.getCount()-1); } } catch (RuntimeException re) { throw new RuntimeException(); } finally { if (session != null && session.isOpen()) { session.flush(); session.clear(); } } }