2017-03-02 54 views
1

我有一個JPA實體包含多對一引用到另一個表,該實體的簡化版本如下:JPA /驗證@ManyToOne關係不應該創建新行

@Entity 
@Table(name = "ENTITIES") 
public class Entity implements Serializable { 
    @Id @NotNull 
    private String id; 

    @JoinColumn(name = "REFERENCE", referencedColumnName = "ID") 
    @ManyToOne(optional = false) 
    private ReferencedEntity referencedEntity; 
} 

@Entity 
@Table(name = "REFERENCES") 
public class ReferencedEntity implements Serializable { 
    @Id @NotNull @Column(name = "ID") 
    private String id; 

    @Size(max = 50) @Column(name = "DSC") 
    private String description; 
} 

查找實體工作正常。有效的實體也可以正常工作,在我的特殊設置中有點太好了,我需要一些額外的驗證。

問題
我的要求是,在表中的行參考是靜態的,不應該被修改或新行補充說。
目前,當我創建一個新的實體實例與不存在的(還)ReferencedEntity和持久化實例,一個新的行被添加到參考

現在我已經在調用persist()之前在自己的validate()方法中實現了此檢查,但我寧願更優雅地執行此檢查。
使用枚舉而不是真正的實體不是一種選擇,我想在未來幾次不用重建/重新部署就自行添加行。

我的問題
什麼是實現這樣的檢查的最佳方式?
是否有一些BV註釋/約束可以幫助我限制這一點?也許是第三方圖書館?

+0

ü可以標記實體'@ immuteable'如果你這樣做不想每次都改寫,其餘的取決於你的'persistence.xml'如何聲明 – emotionlessbananas

+0

如果他使用的是Hibernate。 –

+0

不,我沒有使用Hibernate。我使用EclipseLink作爲JPA實現。 – Bossk

回答

1

這聽起來像你需要先做一個數據庫查詢來檢查值是否存在,然後插入記錄。這必須在事務中完成,以確保查詢結果在插入時仍然爲真。我半年前遇到過類似問題,可能會爲您提供一些關於如何設置鎖定的線索。 Please see this SO question.

+0

是的,這似乎是我唯一的解決方案。我想知道如果我可以把它放在一個自定義驗證器中,但.. – Bossk

0

你應該添加此=>插入= false時,可更新=假

,並刪除=>可選=假的,也許嘗試可爲空=真