根据JPA 2.0规范:
version属性由持久性提供程序运行时更新将对象写入数据库时。所有non-relationship字段和属性以及实体拥有的所有关系
这个似乎不工作在我的情况下。我有两个实体:
@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
关系的"many"一方必须是拥有方,所以在我的例子中,OrderedItem
是拥有方。遵循JPA 2.0规范,我假设当我更改从OrderedItem
访问的Customer
对象时,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)
?
是的,据我所知,如果您重新分配不同的Customer, OrderedItem的版本字段将会更改,但如果您更改客户的属性则不会更改。
另一方面,如果您将另一个OrderedItem添加到Customer的OrderedItem集中,则不会更新Customer的版本字段,因为它不是拥有方。
我想这是有用的,在这里考虑在表行:如果任何列在一个表行改变的版本列的表行得到增加。
如果一个客户端更新OrderedItem的名称,另一个客户端更新Customer的名称,这是可以的-这些更新不会冲突。