在Hibernate中保存其他实体

时间:2013-08-12 08:36:06

标签: hibernate jpa

每当更新或保留某种类型的新实体时,我想保存一个额外的实体。我知道Envers并且不想使用它,因为我有一个轻微的其他用例,具体来说:时间序列。因为在这种情况下性能很重要,我想实现一个真正满足我要求的解决方案。 我知道Hibernate拦截器(例如扩展EmptyInterceptor和覆盖所需的方法,如onFlushDirty)及其事件api(例如PostInsertEventListener,FlushEventListener等)。

在第一种情况下,我还没有找到如何在Interceptor中获取SessionFactory,我将使用它打开一个新的临时会话(使用当前会话的连接)来保存我的自定义时间序列实体。

使用事件api的方法似乎更灵活,更强大,并且通过事件很容易获得会话。但是,据我所知,我必须在那里构建包含所有属性的地图(至少这是我在使用这种方法的envers代码中看到的),所以似乎还有更多的工作要做。

那么使用JPA或Hibernate保存另一个实体的最简单方法是什么?我正在寻找正确的方向还是有其他(更好或更容易)的方法来处理这个我到目前为止忽略的方法?是否有上述方法的已知警告?

更新:为了更清楚,我想保存另一个实体,但不是同一类型。要保存的实体是一个非常简单的对象,它只保存两个日期,对原始实体的引用以及其感兴趣的一个属性的值。

1 个答案:

答案 0 :(得分:0)

我不会这样做,它会打破太多的休眠概念。一个是在内存和数据库中识别实体并且透明地自动同步到数据库。您不能只在刷新脏事件中创建新记录。

  • 可能会在同一笔交易中多次发生。
  • 你会遇到识别,主键,外键等问题......
  • 你会遇到级联问题。每个相关的级联实体也应该被复制,这使得整个事情变得非常复杂。
  • 加载历史记录时会遇到问题,因为没有明确的映射。

你应该考虑:

  • 在您的域模型中实施显式版本控制。这就是我正在进行的项目中正在做的事情。控制java中的逻辑并获得对历史的显式访问。
  • 避免使用ORM并直接在SQL中实现高性能解决方案。只有在性能成为主要问题且您的域模型绝对无足轻重的情况下才能执行此操作。