Hibernate中的版本检查

时间:2018-11-17 08:08:43

标签: hibernate

我正在尝试使用Hibernate更新数据库表的行。

我是否需要编写任何代码来获取旧版本,然后将其与数据库表中的行的最新版本进行比较,以避免在使用Hibernate时出现过时的对象更新异常?

OR

版本由Hibernate自动处理吗?

1 个答案:

答案 0 :(得分:1)

假设您尝试使用optimistic锁定,并且optimistic locking的版本号机制是通过@Version注释提供的,如下所示:

@Version
private long version;

来自文档:

  

此处,version属性映射到version列,并且   实体管理器使用它来检测冲突的更新,并防止   更新丢失,否则将被更新覆盖   最后一次提交的获胜策略。

休眠状态会自动处理version。相应的文档供参考:

https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#locking

添加示例

主类:

public class HibernateVersionMain {

    public static void main(String[] args) {

        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        sessionFactory = HibernateAnnotationUtil.getSessionFactory();
        session = sessionFactory.getCurrentSession();

        Cart2 cart = new Cart2();
        cart.setName("test cart1");
        tx= session.beginTransaction();
        session.saveOrUpdate(cart);

        tx.commit();
        //session.close();
        session = sessionFactory.getCurrentSession();
        tx = session.beginTransaction();
        Cart2 cart2 = (Cart2) session.get(Cart2.class, 1l);
        cart2.setName("test cart1 changed");

        session.saveOrUpdate(cart2);
        tx.commit();
        //session.close();
    }

实体类:

@Entity
@Table(name="CART1")
public class Cart2 {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="cart_id")
    private long id;

    @Column(name="total")
    private double total;

    @Column(name="name")
    private String name;

    @Version
    private int version;

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }



    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public double getTotal() {
        return total;
    }
    public void setTotal(double total) {
        this.total = total;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Cart1 [id=" + id + ", total=" + total + ", name=" + name + "]";
    }

 }

从日志中:

  

信息:HHH000232:架构更新完成休眠:插入CART1   (名称,总数,版本)值(?,?,?)

     

休眠:选择cart2x0_.cart_id作为cart_id1_1_0_,选择cart2x0_.name作为   名称2_1_0_,购物车2x0_。总计总计3_1_0_,购物车2x0_.version,总计   版本4_1_0_来自CART1 cart2x0_,其中cart2x0_.cart_id =?

     

休眠:更新CART​​1集名称= ?、总计= ?、版本=?在哪里cart_id =?   和version =?

数据库表(看看version列检查主代码):

enter image description here

enter image description here