【问题标题】:How to persist entity to two different tables using Spring+Hibernate如何使用 Spring+Hibernate 将实体持久化到两个不同的表
【发布时间】:2012-03-23 05:20:32
【问题描述】:

我想这仅与 Hibernate 相关(我现在才开始使用这两个框架)。我有一个跟踪用户会话的应用程序。当会话处于活动状态时,会话实体存储在活动会话的表中。当用户下线并且会话结束时,会话被移动到辅助历史表中。

如何使用 Hibernate 实现这一点?现在我有一个 Session.hbm.xml 文件,它将 Session 对象映射到活动会话表。我可以将它映射到辅助表并以某种方式指定我希望它在调用 saveOrUpdate 时保留到哪个表吗?

我的声誉目前不允许我这么快回答我自己的问题。不过,我不希望任何人为此浪费时间,因为我找到了答案,所以我将其发布在这里作为编辑。

我可以通过使用映射文件中的实体名称属性来做到这一点。我创建了第二个映射,与 Session.hbm.xml 相同,称为 HistoricalSession.hbm.xml。在这个新的映射文件中,我引用了相同的 Session 类,但添加了:

entity-name="HistoricalSession"

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

saveOrUpdate("HistoricalSession",session);

这正是我想要的,无需为历史会话创建另一个 Java 类

【问题讨论】:

  • 我想过创建一个与 Session 具有相同属性但映射到历史表的 HistoricalSession 实体。在这种情况下,我将从正在关闭的 Session 创建一个 HistoricalSession,然后持久化 HistoricalSession。这可行,但需要创建一个新对象,这是我想避免的成本。

标签: java spring hibernate persistence


【解决方案1】:

有几种方法可以做到这一点:

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

【讨论】:

    【解决方案2】:

    您的需求听起来更像是审计。 检查项目Hibernate Envers 它可能会帮助您以更好的方式解决您的问题。

    【讨论】:

    • 我不了解 Envers 的所有功能(和开销)。我不需要对象更改的历史记录。我需要的是 Session 对象被持久化到不同的表,就像它被持久化到第一个表一样。这只会在一个 Session 中发生一次,然后就再也不会触及该记录了。当会话关闭时,它会移动到历史表中,以便 GUI 可以显示用户过去何时在线等。
    • 实际上它根本没有那么开销,这就是你的观点:)。它是你的应用程序,你选择什么是最好的.....
    【解决方案3】:

    我可以通过使用映射文件中的实体名称属性来做到这一点。我创建了第二个映射,与 Session.hbm.xml 相同,称为 HistoricalSession.hbm.xml。在这个新的映射文件中,我引用了相同的 Session 类,但添加了:

    entity-name="HistoricalSession"
    

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

    saveOrUpdate("HistoricalSession",session);
    

    这正是我想要的,无需为历史会话创建另一个 Java 类

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2021-06-26
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多