我正在尝试使用Hibernate更新数据库表的行。
我是否需要编写任何代码来获取旧版本,然后将其与数据库表中的行的最新版本进行比较,以避免在使用Hibernate时出现过时的对象更新异常?
OR
版本由Hibernate自动处理吗?
答案 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 =?
休眠:更新CART1集名称= ?、总计= ?、版本=?在哪里cart_id =? 和version =?
数据库表(看看version
列检查主代码):