根据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();
OrderedItem
的版本号 1 (因此没有增量),Customer
的版本号 2 。
任何想法为什么?
在写这个问题时,它只是碰到了我的脑袋 - JPA 2.0规范中的“关系”一词是否可能意味着仅如果我更改实体 - - Customer
- 本身(不其状态)版本将递增?就像@JoinColumn(updatable=false)
?
答案 0 :(得分:1)
是的,据我了解,如果您重新分配不同的客户,OrderedItem的版本字段将会更改,但如果您更改了客户的属性,则不会更改。
另一方面,如果您将另一个OrderedItem添加到Customer的OrderedItem集,则客户的版本字段不会更新,因为它不是拥有方。
我想在这里考虑表行是有用的:如果表行中的任何列发生更改,那么表行的版本列会增加。
如果一个客户端更新OrderedItem的名称而另一个客户端更新客户名称,那就没关系了。这些更新不会发生冲突。