java - JPA/hibernate : how to automatically update fields on entity update

标签 java hibernate jpa

我正在使用 Camel 和 JPA 将实体保存到 Postgres 数据库。在每个实体中,我都有一个名为“历史记录”的字段,其中包含给定实体的所有旧值。我正在寻找一种在每次更新操作之前自动填充此字段的方法。 在网上冲浪,我发现了 JPA 拦截器,但我发现它们用于审计/日志记录目的。我错了吗? 最好的方法是什么?

最佳答案

JPA/Hibernate 拦截器(哪一个取决于您使用的版本)是实现此目的的一种方法。审核/日志记录与您想要执行的操作类似,即当实体本身更新(任何属性)时自动更新某些列/属性。请注意,手动更新查询会绕过这些拦截器,因此应该避免使用这些拦截器。

如何使用这些拦截器取决于您想要如何实现历史记录功能。如果您通过生成一些字符串/字节表示并将其存储在列中来完成此操作,那么它应该可以工作。如果您计划创建另一个实体等,您可能必须在拦截器中收集更改/旧值,并在成功提交后存储收集的值。 AFAIK 当拦截器被调用时不可能(至少不容易)创建一个新实体。

关于java - JPA/hibernate : how to automatically update fields on entity update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33994888/

相关文章:

java - Spring Boot 指定 Hibernate 类而不是指定包

spring - 如何将前端给出的临时 ID 映射到生成的后端 ID?

java - 如何在JavaPlot中输出png文件

mysql - 使用 hibernate 时合并两个查询

java - 当向 JTextArea 输入大量文本时,JTextFields 和 JTextArea 会缩小

mysql - Spring + Hibernate - @Table 名称注释的问题

java - 为什么 JPA 实体在 rowKey 属性为主键时抛出异常?

mysql - EclipseLink (JPA 2.1) 查询未返回明显应该返回的结果

java - 无法将类型 'java.lang.String' 的值转换为所需类型 'long' ;嵌套异常是 java.lang.NumberFormatException : For input string: ""

java - 从 Android 应用程序打印到热敏打印机 (DPP 450)