根据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的名称,而另一个更新客户的名称,则没关系-这些更新不会冲突。

08-06 05:39