2013-07-26 52 views
1

例如我有一些實體,如:休眠的UniqueConstraint

@Entity 
public class WorkingScheduleOverride implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Version 
    private Integer version; 

    @Column 
    private Date validFrom; 

    @Column 
    private Date validThru; 

    @Column 
    private Date timestamp; 

    @Column(unique = true) 
    private Date date; 

要檢查該實體是由場日期我加入(唯一=真)唯一的。這可以正常工作,但前提是不要對實體使用「可關閉」方法。如果你想跟蹤這些對象的歷史,這是爲了這種情況。所以我使用'validThru'字段來指定實體何時有效。

所以我的問題是:是否有可能通過使用任何自定義驗證/註釋來檢查唯一性僅限有效實體(validThru == null || validThru < new Date())。在數據庫

不正確的數據(兩個記錄具有相同的日期和兩者都有效):

----------------------------------------------------------------- 
id |version |timestamp |valid_from |valid_thru |date  | 
----------------------------------------------------------------- 
1 |1   |2012-01-01 |2012-01-01 |null  |2013-01-01 | 
----------------------------------------------------------------- 
2 |1   |2012-01-01 |2012-01-01 |null  |2013-01-01 | 
----------------------------------------------------------------- 

數據庫中正確的數據(兩個記錄是相同的日期,但第二個記錄是無效的):

----------------------------------------------------------------- 
id |version |timestamp |valid_from |valid_thru |date  | 
----------------------------------------------------------------- 
1 |1   |2012-01-01 |2012-01-01 |null  |2013-01-01 | 
----------------------------------------------------------------- 
2 |1   |2012-01-01 |2012-01-01 |2012-06-01 |2013-01-01 | 
----------------------------------------------------------------- 

數據庫中的數據不正確(兩條記錄具有相同的日期和都是有效的,第二記錄變爲一月2014僅無效1號):

----------------------------------------------------------------- 
id |version |timestamp |valid_from |valid_thru |date  | 
----------------------------------------------------------------- 
1 |1   |2012-01-01 |2012-01-01 |null  |2013-01-01 | 
----------------------------------------------------------------- 
2 |1   |2012-01-01 |2012-01-01 |2014-01-01 |2013-01-01 | 
----------------------------------------------------------------- 

謝謝

+0

查看這對您是否有任何幫助方案 - http:/ /www.hibernate.org/subprojects/validator.html – Sashi

+0

嗨薩西,這是不可能的驗證。我可以谷歌和感興趣的人誰真的已經解決了這個問題。 –

回答

0

我不確定要理解你的問題,但是。

@PreUpdate 
@PrePersist 
public void checkEntity() { 
    if (validThru != null && validThru.getTime() > new Date().getTime()) { 
     throw new SomeException("Invalid entity"); 
    } 
} 

可以做這項工作。


當您使用unique=true的約束不是在代碼級別,它是在分貝水平。如果您想確保更高級的約束,請創建一個將拒絕插入和更新的觸發器。

如果觸發器無法編碼,則必須強制實體與應用代碼保持一致。使用save(entity)創建一個服務,該服務將拒絕具有例外的有害實體。

+0

嗨塞巴斯蒂安,你不明白這個問題。關於帶條件的UniqueConstraint的問題。在保存到數據庫之前,您需要確保日期在此表中是唯一的,但您只需檢查表中validThru!= null && validThru

+0

在我看來,這是不可能處理這與註釋。或者你需要創建一個自定義的BeanValidation約束,它將能夠檢查數據庫中的記錄。您寧願直接使用應用程序代碼來確保您的條件,而不是嘗試使用註釋 –

+0

這是處理此問題的簡單方法,但這是非常惡劣的解決方案,因爲我需要在保存之前創建額外圖層以檢查「這些」實體是否處於額外條件並分別創建db限制到數據庫,所以如果有人忘記將這個約束條件添加到這兩個地方,潛在地可能會出現失效 –

0

而不是日期,您可以使用TimeStamp.and唯一的列約束verion和id.So任何情況下您的記錄可能是唯一的。 您可以使用狀態作爲列的另一種方式特別記錄Valid-V和Invalid -I.you只能根據所選內容顯示有效或無效的記錄

+0

嗨Ravi,我想你不明白問題的要點 –