2011-12-02 55 views
1

不遞增根據JPA 2.0規範:@Version在關係變化

版本屬性是由持久性提供運行時 當對象被寫入到數據庫更新。所有非關係 字段和屬性和所有關係擁有的由實體包含在版本檢查中的 。

似乎並不在我的情況下工作。我有兩個實體:

@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規範,我認爲當我更改從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(); 

的版本號是OrderedItem (所以沒有增量)和爲Customer

任何想法爲什麼?


它只是碰到了我的頭,而寫了這個問題 - 是有可能,在JPA 2.0規範中的「關係」這個詞意味着只有如果我改變實體 - Customer - 本身( 不是其狀態)版本會增加?就像@JoinColumn(updatable=false)的情況一樣?

回答

1

是的,據我瞭解,OrderedItem的版本字段將改變,如果你重新分配一個不同的客戶,但不是如果你改變客戶的財產。另一方面,如果將另一個OrderedItem添加到Customer的OrderedItem集合,則Customer的版本字段不會更新,因爲它不是擁有者的一方。

我想這裏在表格行中考慮很有用:如果表格行中的任何列更改該表格的版本列,則會增加。

如果一個客戶端更新OrderedItem的名稱和另一個客戶的名稱 - 這些更新不會發生衝突,那很好。

+0

你是對的普塞。我猜JPA無法區分對'Customer'類本身所做的更改或通過OrderedItem訪問,以便允許它。謝謝! –