2011-03-10 53 views
2

我有這個「模式」「後」實體/表:如何從@PrePersist使用EntityManager?

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

@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer postId; 

private Integer revisionId; 
private Boolean isCurrentRevision; 

所以,表中包含的職位,他們每個人都有多個版本,但只有(每篇文章)的是最新的。

現在,讓我們說,我想堅持現有崗位(即更新後)的另一種版本:

我需要找到最高現有於RevisionId這個帖子ID,增加它並將其設置爲於RevisionId。這也是新的當前修訂版,因此應該對其進行相應的標記,但是前一個修訂版應該沒有標記。

但我該怎麼做?我覺得這應該是實體實現的一部分,但另一方面我需要EntityManager來實現這一點。但我找不到注入EntityManager實例的方法(保證存在)。

可能嗎?你如何實現這樣的場景?謝謝!

回答

5

不幸的是,沒有乾淨,便攜的方式來提出你的建議。在JPA 2規範(JSR 317)指出以下:

一般而言,便攜式應用的生命週期方法不應該調用的EntityManager 或查詢操作,訪問其他實體實例,或修改 相同持久性上下文內的關係。

至於實現去,休眠禁止它明確:

回調方法不能調用EntityManager的或查詢方法!

我知道這不是你真正希望的,但似乎你將不得不將修訂管理責任分配給你的實體類的客戶端。

+0

謝謝。我的解決方案是更改數據庫模式,因此不需要任何EntityManager。 – Tomik 2011-03-12 23:54:12

0

這可能是傳輸對象模式的好地方。我們通常像這樣做:
1.後實體轉化爲崗位轉移對象
2.一旦後保存,我們會選擇最高的於RevisionId,增加它並創建一個新的實體

另外,您可以更新當前的帖子並向歷史記錄表添加一個條目(即使在單獨的數據庫中也可以)。因此,爲了獲得更好的性能,您可以儘可能減小發布表,因爲大多數情況下無論如何都需要發佈當前版本的帖子。

相關問題