需要知道每个字段是否已更改,我应该如何在 Hibernate 中对此进行建模

2024-03-02

所以我有一个包含三个字段的类,使用 hibernate 映射到一个表

Class Widget
{
     String field1;
     String field2;
     String field3;
}

在应用程序启动时,许多实例这些小部件将从外部文件添加到数据库中,但是当我退出应用程序时,我需要知道自应用程序启动以来用户更改了这些字段中的哪些(如果有),这样更改就可以保存回文件中。我还需要存储原始值以用于记录目的。

无论我是否需要表中的状态字段,或者是否已经有一种使用 Hibernate/Database 执行此操作的方法,我都无法工作。

编辑:下面给出了该程序的一个很好的解决方案。然而,我使用 Hibernate 的主要原因是为了减少内存消耗,因此在更改时存储原始值对我来说不是一个好的解决方案,我希望将所有内容都存储在数据库中。所以我创建了这个新问题如何在 Hibernate 中存储添加到数据库的每个实体的副本 https://stackoverflow.com/questions/8431299/how-do-i-store-a-copy-of-each-entity-i-add-to-database-in-hibernate


给定如下所示的实体,您可以跟踪其字段之一的更改(同时也保留其原始值)。

@Entity
@Table(schema = "test", name = "test")
public final class Test {

  private static final int ORIGINAL = 0;
  private static final int CURRENT = 1;

  private Integer id;

  // holds the original and current state of the field
  private final AtomicReferenceArray<String> field = new AtomicReferenceArray<>(2);

  @Id
  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  @Transient
  public String getOriginalField() {
    return field.get(ORIGINAL);
  }

  @Basic
  public String getField() {
    return field.get(CURRENT);
  }

  public void setField(String field) {
    this.field.compareAndSet(ORIGINAL, null, field);
    this.field.set(CURRENT, field);
  }

  @PreUpdate
  public void preUpdate() {
    System.out.format("Original: %s, New: %s\n", getOriginalField(), getField());
  }

  ...

}

如果数据库中有一行,如下所示:

     id: 1
  field: a
version: 2011-12-02 11:24:00

之前field已更新(例如,从a to b)您将得到以下输出。

Original: d, New: b

即使实体被多次更新,原始值也会被保留,并且两个状态都可以通过相应的 getter 访问(getField and 获取原始字段——在命名方面你可以比我更有创意:)。

这样,您就可以不用在数据库中创建版本列,并且还可以向客户端隐藏实现细节。

而不是一个AtomicReferenceArray您可以使用数组、列表等来跟踪所有更改,就像这样。

The @PreUpdate当然不是必需的,但这样您就可以收到实体状态更改的通知,并将更新的字段自动保存到文件中。还有更多这样的注释:请参阅文档javax.持久性 http://docs.oracle.com/javaee/5/api/javax/persistence/package-summary.html对于其他注释类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要知道每个字段是否已更改,我应该如何在 Hibernate 中对此进行建模 的相关文章

随机推荐

  • 如何构建 libjpeg 供 ndk 使用

    我下载了 libjpeg 8d 源代码 我想将其编译为 libjpeg so 可以在 android ndk 中使用 因为ndk使用arm架构 但我的PC的gcc是x86架构 所以当我使用gcc编译出libjpeg so并将其放入jni文件
  • 如何从终端重新加载 Google Chrome 标签?

    有没有办法仅使用终端在 Ubuntu 中重新加载 Google Chrome 选项卡 我不想只是打开一个新窗口 而是要实际刷新一个选项卡 额外问题 这在其他浏览器 例如 Opera Safari Firefox 中也可能吗 一个衬垫将聚焦
  • 如何将 django 调试工具栏设置为仅适用于某些用户?

    马上 是的 我知道 INTERNAL IPS 我即将在工作集成和测试中打开我的 Django 应用程序 我知道将会进行调试并进行大量修改和 或优化 所以我很乐意Django 调试工具栏 https github com django deb
  • 使用 URL 加载底部导航栏项目图标内的图像

    我正在尝试使用底部导航栏的项目图标内的 firebase 存储 url 加载个人资料图像 这是我的代码 Glide with getApplicationContext asBitmap load profilePicUrl into ne
  • AttributeError:尝试在 Discord.py 中创建按钮时,模块“discord”没有属性“ui”

    我想知道如何使用discord py 制作按钮 这将是我想要的一个例子 My Code import discord from discord ext import commands client commands Bot command
  • 如何知道按下的是什么字符键?

    我想知道在纯 Javascript 中以跨浏览器兼容的方式按下了什么字符键 清除 JavaScript function myKeyPress e var keynum if window event IE keynum e keyCode
  • 节省内存和编译时间

    有什么方法可以使用模块在 perl 中节省内存和编译时间吗 例如 不加载所有不必要的 未使用的子程序 或者 如果我将我的潜艇分成许多不同的 这是一个好方法pm文件 然后我只加载必要的模块 例如 usr bin perl w sub mysu
  • mkdir() 不工作

    My code mkdir some absolute path 0777 and mkdir relative path 0777 不起作用 安全模式已关闭 我什至尝试将所有父文件夹设置为 777 有任何想法吗 编辑 我确实打开了错误报告
  • 如何从memfd_create获取内存地址?

    在我的应用程序中我需要共享内存 父母和孩子之间 使用fork execl 我用memfd create分配内存 因为它提供了 文件描述符 可以方便地在子进程中使用 进程 描述符通过dup2 before execl 附加到分配的内存 我不使
  • 扁平列表和免费 monad

    我试图说服自己 List monad 具有平面列表 列表串联和按元素映射的列表 不是一个自由 monad 准确地说 是与某个函子 T 关联的自由 monad 据我了解 我应该能够通过以下方式实现这一目标 首先在 monad 列表中找到常用运
  • 如何将 JSON 转换为 GeoJSON

    我对 javascript 的学习还很陌生 我的基础知识已经碰壁了 我已经设置了一个传单地图 我希望从 JSON 中的绳索上绘制基于 divIcon 的标记 通过我无数次的研究 试图让它发挥作用 我了解到为什么我的 JSON 文件无法工作
  • Matplotlib imshow 中内存使用过多

    我有一个 PyQT4 应用程序 可以在 Matplotlib 图中显示中等大小的图像 我显示的测试图像约为 5Mb 2809 x 1241 像素 顺便说一下 我使用GDAL读取数据 图像被读入数组 其中无数据值被屏蔽 然后用标准化值和指定的
  • NetworkX - 删除节点并重新连接边

    我在图中有一个节点 充当一种 临时连接器 节点 我想删除该节点并更新图中的边 以便其所有直接前驱节点都指向其直接后继节点 是否有内置功能可以做到这一点networkx 或者我需要推出自己的解决方案吗 Example 我有一个图表1 gt 2
  • Kubectl设置环境变量并运行命令

    我有一个在 Kubernetes 上运行的容器 我想在其中从本地终端运行命令 基于其 yaml 文件的容器的工作目录位于 opt gopath src a 但是 我想在目录中运行命令 opt gopath src b 此外 在运行此命令之前
  • OpenCV 和 Python 的书籍? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何关闭ViteJS的模块热加载功能?

    我有一个服务器端渲染production模式Vite应用 我的问题是 网页通常会重新加载并且控制台将显示 vite connecting 我将此追溯到 vite 代码库的热模块重新加载部分 然而 我不想hmr on for producti
  • ggbiplot - 如何不在图中使用特征向量

    我有一个数据集数据 cell line sva 其暗淡为 313 11875 cc pca lt prcomp data cell line sva center TRUE scale TRUE retx TRUE g lt ggbiplo
  • Spring Boot 和 Maven 战争叠加

    我正在使用 Maven 多模块 其中一场战争取决于另一场战争 Spring Boot Web 应用程序依赖于一个仅提供 html 文件的基本 Web 应用程序 当我运行 Spring Boot 应用程序时 我可以从主 web 应用程序 Sp
  • 在 Scala 中使用 json 对象的 play 框架

    你好 我是 scala play 框架的初学者 我创建了一个简单的注册表单并连接到 mysql 来插入行 效果很好 现在我想在同一页面上显示这些插入的行 而不使用 json 刷新页面 请建议我一个想法如何在同一页面上获取插入的行 提前致谢
  • 需要知道每个字段是否已更改,我应该如何在 Hibernate 中对此进行建模

    所以我有一个包含三个字段的类 使用 hibernate 映射到一个表 Class Widget String field1 String field2 String field3 在应用程序启动时 许多实例这些小部件将从外部文件添加到数据库