2016-07-15 58 views

回答

1

至於JPA規範告訴我們您無法通過「配置」更改@Version註解。您在程序代碼中使用@Version或者您沒有。

參照官方JPA specification(最終版本,JPA 2.1)3.4.2節(第90頁),我們發現:

一個實體的樂觀鎖定如果它有一個屬性或自動啓用字段使用Version映射映射。

[...]

如果只有一些實體包含版本屬性,持久化提供商運行時需要檢查哪一個版本屬性已被指定的實體。對象圖一致性不保證,但是某些實體上沒有版本屬性不會阻止操作完成。

但是,您可以使用繼承的概念通過抽象基類提供@Version只在一個地方。你可以寫成這個類如下:

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class AbstractBaseEntity { 

    public static final long INVALID_OBJECT_ID = -42; 

    @Version 
    private int version;  

    @Id 
    @SequenceGenerator(name = "sequence-object", sequenceName = "ID_MASTER_SEQ") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence-object") 
    @Column(name = "id") 
    protected Long objectID = INVALID_OBJECT_ID; 

    public final int getVersion() { 
     return version; 
    } 

    @Override 
    public long getObjectID() { 
     return objectID; 
    } 

    // ... maybe other methods or fields ... 
} 

因此,提供有兩個屬性所有@Entity註解,從AbstractPersistentEntity繼承子類:(I)objectID及(ii)version一次。

@Entity 
public class SomeClass extends AbstractBaseEntity /*implements SomeInterface*/ { 
    // ... specific methods or fields ... 
} 

有關使用@MappedSuperclass詳見也this answer:例如,類SomeClass可以作爲被寫入。

希望它有幫助。

+0

太棒了 - 謝謝 - 我使用的是Spring的AbstractPersitable ATM,所以我可能只是子類,除非你知道Spring內部還提供了版本屬性。 – Ole

相關問題