2011-11-16 37 views
2

鑑於以下兩個實體JPA:設置@JoinColumn(更新= false)來避免OptimisticLockException

@Entity 
public class A { 
    @Version 
    protected int version; 

    String basicPropertey; 

    // getter and setter for basicProperty 
} 

@Entity 
public class B { 
    @Version 
    protected int version; 

    @ManyToOne 
    private A a; 

    public B(A a) { 
    this.a = a} 
    } 

    //getter for a 
} 

兩個問題如下:

  1. 是否有實體A每增加版本號時間 實體B被合併到DB(請注意,沒有 CascadeType.MERGE定義在與A的關係上),並因此導致 可能出現OptimisticcLockException,當A與 不同的版本號?

  2. 如果是的話,這將有助於避免,如果我在 關係添加@JoinColumn(updatable=false)的 OptimisticLockException的可能性有多大?

我的情況是,實體B非常頻繁升級以及偶爾出現,但只有它的基本屬性(非關係),我在實體A.

+0

我不確定什麼鎖定類型是默認鎖定類型,但是您是否嘗試用鎖定模式(「OPTIMISTIC」與「OPTIMISTIC_FORCE_INCREMENT」)進行擺弄? –

+0

我認爲默認情況下它是OPTIMISTIC。我認爲這裏沒什麼關係,因爲當你明確地使用實體管理器的鎖API時,你只能指定鎖模式,而我不這樣做。我所擁有的只是@Version領域。 – Theo

回答

1

得到一個OptimisticLockException如果只有你改變B,那麼你就不能得到A.

鎖錯誤你纔會對B.

得到鎖錯誤檢查你的SQL登錄到你實際上在做什麼。

+0

B和A已更新。但B中的更新並未觸及其關係A. – Theo