如何使用Spring + Hibernate将实体持久化到两个不同的表

时间:2012-03-05 18:12:18

标签: java spring hibernate persistence

我认为这仅适用于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类

3 个答案:

答案 0 :(得分:5)

我可以通过在映射文件中使用entity-name属性来完成此操作。我创建了第二个映射,与Session.hbm.xml相同,名为HistoricalSession.hbm.xml。在这个新的映射文件中,我引用了相同的Session类,但添加:

entity-name="HistoricalSession"

然后我像往常一样将对象映射到我的第二个(历史)表。调用save()或saveOrUpdate()默认使用classname作为实体名称,并像以前一样保存在我的主表中。现在,当我想将会话保存到历史表时,我使用允许您指定实体名称的Hibernate API覆盖:

saveOrUpdate("HistoricalSession",session);

这完全符合我的要求,无需为历史会话创建另一个Java类

答案 1 :(得分:1)

有两种方法可以:

  • 会话过期时使用数据库触发器,trrigger会将行移动到历史表中。
  • 您可以创建一个HistoricalSession extends Session,然后为HistoricalSession执行第二个映射,并编写要从Session中删除的代码并插入到历史会话中。

答案 2 :(得分:0)

您的需求听起来更像是审计。 检查项目Hibernate Envers它可能有助于更好地解决您的问题。