1

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

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

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

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

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

4

1 回答 1

0

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

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

您应该考虑:

  • 在您的域模型中实施显式版本控制。这就是我在我目前正在从事的项目中所做的事情。控制java中的逻辑并获得对历史的显式访问。
  • 避免使用 ORM 并直接在 SQL 中实现高性能解决方案。仅当性能是一个主要问题并且您的域模型绝对微不足道时才这样做。
于 2013-08-12T08:55:42.150 回答