簡體   English   中英

驗證 Hibernate EntityListener 中的限制

[英]Validating restrictions in Hibernate EntityListener

我想在保存或更新實體時進行復雜的驗證。 例如,我想檢查實體的屬性之一是否是唯一的,但是在復雜的條件下我無法在唯一約束中聲明。

我對新實體使用@PrePersist,對現有實體使用@Pre/PostUpdate。 @PrePersist 在所有情況下都運行良好,但在更新現有實體時發生了不同的錯誤。 如果我將我的 CRUD 服務注入監聽器,並根據屬性值檢查是否有任何現有記錄,我會得到堆棧溢出異常 - 我想是因為每次我調用 CRUD 服務時,Hibernate 都會嘗試在運行查詢之前更新實體,以及原因所以-。 在 EntityListener 中使用 CRUD 服務不是一個好習慣嗎?

另一個我不知道如何解決的問題,如果值無法持久化,我想拋出自定義異常來通知前端。 如果我調用 saveAndFlush() 只會拋出我的異常。 但是如果我只使用 save() 在我的自定義異常之后也會拋出 TransactionSystemException 並且 TransactionSystemException 將填充到前端而不是我的異常。

org.springframework.transaction.TransactionSystemException: 無法提交 JPA 事務; 嵌套異常是 javax.persistence.RollbackException:提交事務時出錯

如何防止 RollbackException? 在 EntityListener 中檢查這些限制是個好主意嗎? 我的目標是實現一個自動驗證這些限制的層。

我想在保存或更新實體時進行復雜的驗證。 例如,我想檢查實體的屬性之一是否是唯一的,但是在復雜的條件下我無法在唯一約束中聲明。

您可能應該使用支持此功能的數據庫,因為如果沒有它,您將很難快速正確地完成此操作。 PostgreSQL 允許您指定部分唯一索引,這些索引本質上是數據子集的唯一約束。 例如,您可以create unique index abc on tbl (tenant_id, some_code) where deleted = false

如果這對您不起作用,您可能必須使用 SERIALIZABLE 隔離級別來確保正確性,或者使用某種全局鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM