关系改变后@Version不会增加

时间:2011-12-02 00:08:41

标签: java jpa-2.0 eclipselink java-ee-6 one-to-many

根据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)

一样

1 个答案:

答案 0 :(得分:1)

是的,据我了解,如果您重新分配不同的客户,OrderedItem的版本字段将会更改,但如果您更改了客户的属性,则不会更改。

另一方面,如果您将另一个OrderedItem添加到Customer的OrderedItem集,则客户的版本字段不会更新,因为它不是拥有方。

我想在这里考虑表行是有用的:如果表行中的任何列发生更改,那么表行的版本列会增加。

如果一个客户端更新OrderedItem的名称而另一个客户端更新客户名称,那就没关系了。这些更新不会发生冲突。