Проверка версий в Hibernate - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь обновить строки таблицы базы данных, используя Hibernate.

Нужно ли писать какой-либо код для получения старой версии, а затем сравнивать его с последней версией строк в таблице базы данных, чтобы избежать исключения обновления устаревших объектов при использовании Hibernate?

ИЛИ

управление версиями выполняется Hibernate?

1 Ответ

0 голосов
/ 17 ноября 2018

Предполагается, что вы пытаетесь использовать 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, проверьте основной код):

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...