Согласно спецификации 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)
?