根据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)
一样? 最佳答案
是的,据我了解,如果您重新分配其他客户,则OrderedItem的版本字段将更改,但是如果您更改客户的属性,则不会更改。
另一方面,如果将另一个OrderedItem添加到Customer的OrderedItem集,则Customer的版本字段不会更新,因为它不是所有者。
我认为在表行中进行思考很有用:如果表行中的任何列发生更改,则该表行的版本列会递增。
如果一个客户端更新OrderedItem的名称,而另一个更新客户的名称,则没关系-这些更新不会冲突。