Предполагается, что вы пытаетесь использовать optimistic
блокировку, а механизм номера версии для optimistic locking
предоставляется посредством аннотации @Version
, как показано ниже:
@Version
private long version;
Из документов:
Здесь свойство version сопоставляется со столбцом версии, и менеджер сущностей использует его для обнаружения конфликтующих обновлений и предотвращения потери обновлений, которые в противном случае были бы перезаписаны стратегией last-commit-wins.
Спящий режим позаботится о 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: обновление схемы завершено. Hibernate: вставьте в CART1 (имя, общее количество, версия) значения (?,?,?)
Hibernate: выберите cart2x0_.cart_id в качестве cart_id1_1_0_, cart2x0_.name в качестве имени2_1_0_, cart2x0_.total в качестве итогового значения 3_1_0_, cart2x0_.version в качестве версии 4_1_0_ из CART1 cart2x0_ где cart2x0_.cart_id: 10 * *: = 10 *: CART_N =итого = ?, версия =?где cart_id =?и версия =?
Таблицы базы данных (посмотрите на столбец version
, проверьте основной код):