2013-09-10 10 views
1

Приложение использует оптимистичную блокировку, определяя атрибуты версии в своих классах сущностей. Приложение выполняет массовое обновление сущностей с использованием запроса JPQL. В этом случае правильное утверждение ниже?поведение атрибутов версии в массовом обновлении

A. Поставщик постоянства гарантирует, что значение версии в каждой таблице будет обновлено.

B. Значение атрибутов версии обновленных прав должно быть также явно обновлено запросом.

Согласно спецификации JPA

«Массовое обновление карт непосредственно к операции обновления базы данных, минуя оптимистической блокировки проверки. Переносные приложения необходимо вручную обновить значение столбца версии, если желательно и/или вручную подтвердите значение значение столбца версии. "

Так как в моем понимании вариант В является правильным ответом. Но некоторые из моих коллег говорят по-другому. Не могли бы вы сказать мне правильное поведение?

ответ

1

Вы правы, что касается спецификации A, это определенно неправильный ответ.

Специфические реализации спецификации все еще в порядке, чтобы обновить значение @Version при выполнении массового обновления JPQL. Как мы надеемся, документально подтверждена определенная реализация. Если нет, нижеследующий может быть использован для проверки того, влияет ли объемное обновление на версию:

@Entity 
public class SomeEntity { 
    @Id private int id; 
    private String someValue; 
    @Version private int version; 
    //getters, setters 
} 

    //creating entity 
    tx.begin(); 
    SomeEntity se = new SomeEntity(); 
    se.setId(1); 
    em.persist(se); 
    tx.commit(); 

    String versionJpql = "SELECT se.version FROM SomeEntity se WHERE se.id = 1"; 
    //original version 
    Integer version = em.createQuery(versionJpql,Integer.class).getSingleResult(); 

    //bulk update 
    tx.begin(); 
    em.createQuery(
      "UPDATE SomeEntity se SET se.someValue='some' WHERE se.id = 1" 
    ).executeUpdate(); 
    tx.commit(); 

    Integer versionAfterUpdate = em.createQuery(versionJpql, Integer.class) 
      .getSingleResult(); 

    //has version been changed: 
    assertEquals(version, versionAfterUpdate); 
+0

Спасибо Микко за вашу помощь и пример! – sauumum

Смежные вопросы