我是一位Java EE/EJB noob,但是從我收集的文檔和其他帖子中,您無法在實體期間使用相同的entitymanager/session查詢數據庫驗證。在Hibernate驗證期間執行EntityManager查詢的正確方法
一般而言,便攜式應用的生命週期方法不應該調用的EntityManager 或查詢操作,訪問其他實體實例,或修改 相同持久上下文內的關係。[43]生命週期回調方法可能會修改調用它的實體的非關係狀態 。
請翻譯?
這是相當抽象的...可以用更具體的術語來解釋它嗎?它會導致更多的問題,而不是它的答案。例如,如果我的實體有一個延遲加載的集合,我允許在驗證期間訪問它嗎?該集合是「另一個實體」,將需要一個似乎違反文檔的數據庫查詢。
這個'生命週期需求'看起來很奇怪,因爲某些驗證確實需要查詢數據庫,這只是生活中的事實。
從其他帖子我也看到人們通過使用entitymanagerfactory創建一個新的entitymanager/session來解決這個查詢問題。
這使我兩個問題有關使用EntityManagers和Hibernate驗證:
- 是否有可能我有某種設計缺陷或正在濫用Hibernate的驗證,因爲我需要驗證過程中查詢數據庫?
- 鑑於我使用Java EE與JBoss,我如何注入我的驗證與EntityManagerFactory?
我已經試過這樣的事情:
@Stateless
public class UserValidator implements ConstraintValidator<ValidUser, User> {
@PersistenceUnit(unitName="blahblah")
EntityManagerFactory emf;
...
}
但EMF永遠不會被注入。我在猜測@Stateless標籤變得不相關,因爲我正在實現一個ConstraintValidator接口,這是Hibernate Validator的工作所需要的。
那麼從驗證器獲取EntityManagerFactory的一般模式是什麼?
謝謝!
聽起來就像你試圖驗證用戶不存在,爲什麼不讓數據庫這樣做? – rdcrng
真的,我在一般意義上提出這個問題。需要將數據庫訪問作爲驗證的一部分對我來說並不罕見。在這種特殊情況下,儘管我有一項業務要求,即用戶更改密碼不會重複使用舊密碼。所以我必須加入密碼錶。我懶加載列表,但有一個方法User.getOldPasswords()是醜陋的,所以我寧願不將List pwds映射到用戶身上,只是在驗證過程中查詢db。 –
lostdorje