@版本不随关系变化而增加



根据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的名称,这是可以的-这些更新不会冲突。

最新更新