【问题标题】:How to update object after insert/update插入/更新后如何更新对象
【发布时间】:2014-03-04 20:34:37
【问题描述】:

我们的一些表有触发器,以便它们在每次放置操作后更新插入/修改的实体。

如何指示 Hibernate 在 put () 操作后立即读取实体,以便应用程序始终可以访问从数据库读取的最准确数据(包括触发器修改的数据)。 为简单起见,假设触发器在 put() 操作后立即触发。

我正在寻找像 select-after-update 或 select-after-insert 这样的注释。 更好的解决方案是如果我可以指定插入/更新后要读取的列。

更新:

@Generated 注释在我的情况下不起作用,因为我正在使用 @ColumnTransformer 注释作为 modifiedDate 字段,如 here 所述。

@Generated 在这里完全失败,因为它导致 Hibernate 相信数据库会为它生成价值。因此,在插入/更新期间,将忽略在列上指定的自定义写入 SQL。

我想要 @Generated 注释中的重新加载功能,但在插入/更新期间没有忽略字段部分。

【问题讨论】:

    标签: sql hibernate jpa jpa-2.0


    【解决方案1】:

    您正在寻找the @Generated annotation

    【讨论】:

    • 谢谢 JB。我在这种方法中看到的唯一问题是,如果将此注释应用于基类的字段,Hibernate 会发出与层次结构中的实体一样多的选择命令。是否有可以在类级别指定的注释,以便一次性加载根对象下的所有对象?在这种情况下,单个大选择命令会更有效。
    • 这是一个很少使用的功能,众所周知效率低下(因为插入/更新需要额外的选择),我怀疑 Hibernate 是否已尽其所能优化它。也就是说,我不明白为什么它会发出许多选择,而不仅仅是加载实体状态所需的选择。
    • 我刚才已经测试过了。场景是:实体 A 具有实体 B 对象的列表。 A 和 B 都派生自基类 BASE。现在 BASE 类有一个字段 modifiedDate 由数据库生成。当我执行 put 时,Hibernate 会为所有 A 和 B 对象生成插入命令。但是,它还会为每个实体生成一个选择命令。因此,如果 A 有 5 个 B 对象,则会生成 6 个选择命令。如果只有一个选择来加载所有带有 A 的 B(即使我们选择 A 和 B 的所有字段),它的性能会更好。请注意,我说的是具有更大层次结构的对象。
    • JB Nizet,我已经更新了我的问题,为什么 @Generated 不适用于我的案例(即使我们将性能问题放在一边)。任何帮助将不胜感激。非常感谢!
    • 我不关注你。您首先说该值是由数据库生成的,现在您说它是由您的代码生成的。如果它是由您的代码生成的,则无需刷新任何内容。无论如何,我不会对 modifiedDate 字段使用触发器。改为使用实体侦听器(PreInsert、PreUpdate JPA 回调)。
    【解决方案2】:

    我不认为它可以在一次操作中完成。正如你所说,@Generated 将简单地忽略该列,@PostPersist 和 @PostUpdate 无法调用 EntityManager 或查询(请参阅文档https://docs.jboss.org/hibernate/core/4.0/hem/en-US/html_single/#d0e2985

    此外,如果您在同一个事务中执行此操作,那么当您再次尝试加载数据时,如何保证触发器的执行完成?

    在我看来,您唯一的出路是在对象上保存或更新之后的 refresh(),在另一个事务中。

    【讨论】:

    • Julien,我正在寻找一个注释,它可以完成 @Generated 的一半工作,即它只在插入/更新后读取指定字段的值,而不在插入/更新期间抑制其填充。在 Generated 的情况下,Hibernate 假设值纯粹由数据库生成,而不考虑用户可能已经为这样的字段指定了一些 SQL,这些 SQL 将在数据库端执行以生成该字段的值。换句话说,一些注释让 Hibernate 在插入/更新期间编写自定义 SQL,然后也允许它读取相同的 SQL。
    • 我明白你想要达到的目标,@Generated 绝对不能胜任,我同意。不幸的是,JPA/Hibernate 似乎没有提供这种功能,甚至通过限制 PostPersist 和 PostUpdate 的使用来禁止这种行为。
    猜你喜欢
    • 2021-02-06
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多