【问题标题】:Refreshing entity after database trigger数据库触发后刷新实体
【发布时间】:2019-04-05 15:03:39
【问题描述】:

我想更新实体的某些字段,然后返回更新后的实体。相应的表有一个更新触发器,它在列中设置当前时间戳(我想在数据库级别而不是通过 JPA 执行此操作)。

首先,我使用实体管理器的 find() 方法通过其 ID 检索现有实体,然后使用实体的设置器更新一些字段。但是,当我返回实体时,我的 Java 实体的更新列/字段没有更新,即使它是通过更新触发器在数据库表中更新的。

我在设置更改的值后尝试了实体管理器的 refresh() 方法,但这似乎使我的所有更改无效(可能是因为实体尚未提交?)。

1) 除了让事务提交然后使用 find() 再次检索实体之外,还有更好的方法来获取正确的值吗?

2) 我不确定如何在我的实体中注释“上次更改”列。注释仅由数据库触发器更改的字段的最佳方法是什么?现在我正在使用(因为我只希望数据库触发器更新这个字段):

@Column(name = "last_changed", nullable = false, insertable = false, updatable = false)

有人对此有一些有用的意见吗?任何帮助表示赞赏,谢谢!

【问题讨论】:

  • 调用 setter 不会向数据库写入任何内容,因此不会执行触发器。写入数据库的是 flush() 操作(在提交之前自动调用,并且在执行一些查询之前,其结果取决于挂起的更改)。所以你需要先调用flush(),然后再调用refresh()。这显然会比在没有触发器的情况下在 Java 中使用它更慢且效率更低
  • @JBNizet 谢谢,这就是我想要的。我忘了我可以在不先提交的情况下刷新。

标签: hibernate jpa


【解决方案1】:

1) 除了让 事务提交,然后再次使用检索实体 查找()?

正如@JBNizet 评论的那样:“所以你需要先调用flush(),然后再调用refresh()。”

2) 我不太确定如何在我的 实体。注释字段的最佳方法是什么,只有更改 通过数据库触发器?

除了将可插入和可更新设置为 false 的 @Column 注释之外,还可以使用休眠注释 @Generated,如图所示 in this answer here. 然而,这打破了任何“仅限 JPA”的方法。

【讨论】:

    猜你喜欢
    • 2023-02-07
    • 2012-11-03
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多