@Version не увеличивается при изменении отношений - PullRequest
1 голос
/ 02 декабря 2011

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

Атрибут версии обновляется средой выполнения поставщика сохраняемости. когда объект записывается в базу данных. Все не отношения поля и свойства и все отношения , принадлежащие субъекту включены в проверки версий.

Это , похоже, не работает в моем случае. У меня есть две сущности:

@Entity
public class OrderedItem {

    @Id
    @GeneratedValue
    private int id;

    private String name;

    @ManyToOne
    private Customer owner;

    @Version
    private int version;

    public OrderedItem(String name) {
        this.name = name;
    }

    // default constructor + bunch of simple accessors and mutators
}

@Entity
public class Customer {

    @Id
    @GeneratedValue
    private int id;

    private String name;

    @OneToMany(mappedBy = "owner")
    private Set<OrderedItem> orderedItems = new HashSet<OrderedItem>();;

    @Version
    private int version;


    public Customer(String name) {
        this.name = name;
    }

    // default constructor + bunch of simple accessors and mutators
}

Сторона "многие" отношения ManyToOne должна быть стороной-владельцем, поэтому в моем случае OrderedItem является стороной-владельцем. Следуя спецификации JPA 2.0, я предполагаю, что при изменении объекта Customer, доступ к которому осуществляется с OrderedItem, следует увеличить версию объекта OrderedItem. Поэтому я попытался проверить это:

Customer john = new Customer("John");
OrderedItem milk = new OrderedItem("Milk");

milk.setOwner(john);
john.getOrderedItems().add(milk);

startTx();

em.persist(john);
em.persist(milk);

stopTx();

startTx();

OrderedItem milkFromPC = em.find(OrderedItem.class, milk.getId());
milkFromPC.getOwner().setName("Michael");

stopTx();

Номера версий: 1 для OrderedItem (без увеличения) и 2 для Customer.

Есть идеи, почему?


Это просто врезалось мне в голову при написании этого вопроса - возможно ли, что слово "отношения" в спецификации JPA 2.0 означает, что только , если я изменю сущность - Customer - сама ( не свое состояние) версия будет увеличиваться? Как в случае @JoinColumn(updatable=false)?

1 Ответ

1 голос
/ 02 декабря 2011

Да, насколько я понимаю, поле версии OrderedItem изменится, если вы переназначите другого Клиента, но не измените его свойство.

С другой стороны, если вы добавите другоеOrderedItem для набора OrderedItem Заказчика, поле версии Заказчика не обновляется, поскольку оно не является владельцем.

Полагаю, здесь полезно подумать здесь о строках таблицы: если какой-либо столбец встрока таблицы изменяет столбец версии этой строки таблицы.

Хорошо, если один клиент обновляет имя OrderedItem, а другой - имя клиента - эти обновления не конфликтуют.

...