簡體   English   中英

如何使用Spring + Hibernate將實體持久化到兩個不同的表

[英]How to persist entity to two different tables using Spring+Hibernate

我想這只適用於Hibernate(我現在才開始使用這兩個框架)。 我有一個跟蹤用戶會話的應用程序。 會話處於活動狀態時,會話實體存儲在活動會話的表中。 當用戶離線並且會話結束時,會話將移至輔助歷史表。

如何使用Hibernate實現這一目標? 現在我有一個Session.hbm.xml文件,它將Session對象映射到活動會話表。 我可以將它映射到輔助表,並以某種方式指定在調用saveOrUpdate時我希望它保留在哪個表中嗎?

我目前的聲譽不允許我快速回答我自己的問題。 我不希望任何人浪費時間在這上面,因為我找到了答案,所以我在這里作為編輯發布。

我可以通過在映射文件中使用entity-name屬性來完成此操作。 我創建了第二個映射,與Session.hbm.xml相同,名為HistoricalSession.hbm.xml。 在這個新的映射文件中,我引用了相同的Session類,但是添加:

entity-name="HistoricalSession"

然后我像往常一樣將對象映射到我的第二個(歷史)表。 調用save()或saveOrUpdate()默認使用classname作為實體名稱,並像以前一樣保存在我的主表中。 現在,當我想將會話保存到歷史表時,我使用允許您指定實體名稱的Hibernate API覆蓋:

saveOrUpdate("HistoricalSession",session);

這完全符合我的要求,而無需為歷史會話創建另一個Java類

我可以通過在映射文件中使用entity-name屬性來完成此操作。 我創建了第二個映射,與Session.hbm.xml相同,名為HistoricalSession.hbm.xml。 在這個新的映射文件中,我引用了相同的Session類,但是添加:

entity-name="HistoricalSession"

然后我像往常一樣將對象映射到我的第二個(歷史)表。 調用save()或saveOrUpdate()默認使用classname作為實體名稱,並像以前一樣保存在我的主表中。 現在,當我想將會話保存到歷史表時,我使用允許您指定實體名稱的Hibernate API覆蓋:

saveOrUpdate("HistoricalSession",session);

這完全符合我的要求,而無需為歷史會話創建另一個Java類

有兩種方法可以:

  • 會話過期時使用數據庫觸發器,trrigger將行移動到歷史表。
  • 您可以創建一個HistoricalSession extends Session,然后為HistoricalSession執行第二個映射,並編寫要從Session中刪除的代碼並插入到歷史會話中。

你的需求聽起來更像是審計。 檢查項目Hibernate Envers它可能有助於以更好的方式解決您的案例。

暫無
暫無

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

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