EclipseLink 审核/历史记录/跟踪更改

2023-12-31

我尝试实现一种跟踪数据更改并为我的应用程序创建历史日志的方法。因为我正在使用 EclipseLink,所以应该很容易并且可以像它们一样获得更改写在 EclipseLink FAQ 上 http://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_access_what_changed_in_an_object_or_transaction.3F第一个解决方案有效,但第二个基于事件的解决方案不起作用。每次引发事件时,对象更改集都为空。

我不简单地使用 HistoryPolicy 的原因是我不想将有关登录用户(不是数据库用户)的信息和更改的数据存储到单独的表中。我进行了很多搜索,但找不到解决这个问题的方法。

这是我的实体类:

@Entity
@EntityListeners(HistoryEventListener.class)
@Table(name = "t_users")
    public class Users implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GENSEQ_USERS")
@SequenceGenerator(name = "GENSEQ_USERS", sequenceName = "SEQ_USERS", allocationSize = 1, initialValue = 1)
private Integer id;
@Column(nullable = false)
private String userid;
...
}

这是我的 DescriptorEventAdapter 类:

public class HistoryEventListener extends DescriptorEventAdapter {

@Override
public void postUpdate(DescriptorEvent event) {
    ObjectChangeSet changeSet = event.getChangeSet();
    if (changeSet != null) {
        System.out.println("ObjectChangeSet not null");
    }
    System.out.println("ObjectChangeSet null");
}

@Override
public void postMerge(DescriptorEvent event) {
    ObjectChangeSet changeSet = event.getChangeSet();
    if (changeSet != null) {
        System.out.println("ObjectChangeSet not null");
    }
    System.out.println("ObjectChangeSet null");
}
}

我使用过的 persistence.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="PhoneBookPU" transaction-type="RESOURCE_LOCAL">
    <provider>
        org.eclipse.persistence.jpa.PersistenceProvider
    </provider>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@somehostname:1521:xyz"/>
        <property name="javax.persistence.jdbc.password" value="getyourown"/>
        <property name="javax.persistence.jdbc.user" value="username"/>
        <property name="javax.persistence.logging.level" value="INFO"/>
    </properties>
</persistence-unit>
</persistence>

任何帮助将非常感激。


看起来更改集只是为合并事件设置的,而不是为 postUpdate 设置的。请记录错误以将更改集添加到更新前/更新后事件中。

您还可以从查询或对象中获取 ChangeSet,

((UpdateObjectQuery)event.getQuery()).getObjectChangeSet()

or,

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

EclipseLink 审核/历史记录/跟踪更改 的相关文章

随机推荐

  • 如何捕获 django url 中包含一个或多个正斜杠的字符串

    我的代码看起来像这样 urls py from django urls import path from import views app name graduates urlpatterns path status detail
  • 我可以将 ShowDialog() 设置为不在最顶层吗?

    有没有办法将 ShowDialog 设置为不在最顶层 我已经查看了所有相关的SO问题 但没有一个quite符合我的情况 我所做的是从 datagridview 按钮列打开一个新的 WinForm 这个新表单从几个 SQLite 表中提取信息
  • PostgreSQL 更改返回行的顺序

    我有一个名为类别的表 其中包含 ID long Name varchar 50 parentID long 和 shownByDefault boolean 列 该表包含 554 条记录 所有显示的默认值都是 假 当我执行 从类别中选择 i
  • 使用 VBScript 自动化应用程序

    我是 VB 脚本编写新手 我希望 VB 脚本根据应用程序的事件进行操作 例如 VBScript 应该等到应用程序中出现弹出消息 VBScript 和 Windows 脚本宿主仅支持原始 GUI 自动化 例如激活窗口 AppActivate
  • 如何存储每个类别对象的总提款金额?

    我有一个Category类 并且该类的每个实例都有一个分类帐属性 该分类帐属性实际上是一个字典列表 其中包含以下形式的取款和存款金额以及描述 amount amount description description 现在 我想定义一个函数
  • 在 Blend 2015 中使用 3D OBJ 文件

    我刚刚开始学习 WPF 3D 并按照教程进行操作 我创建了一个 3D 模型并将其导出为 OBJ 文件 创建一个新的 WPF 项目并添加此 OBJ 文件 我如何在里面使用它Window or Viewport3D 我在 Microsoft 找
  • 便携式图书馆的语言选择

    我想编写一个库 它将与在 Windows Linux 和 OS X 等现代操作系统上运行的其他程序动态链接 即 它将部署为 dll or so模块 在这种情况下最合适的语言是什么 我应该坚持使用纯 C 吗 或者C 也可以吗 您可以使用 C
  • std::lower_bound 和 std::set::lower_bound 之间的差异

    C 草案谈到了 std lower bound 25 4 3 1 lower bound lower bound template
  • 可以在沙箱中运行的 Mini-OSGi(如 AppEngine 或 WebStart)?

    我真的很喜欢 OSGi 实现的模块化捆绑包的概念 我还喜欢 托管部署 服务 例如 Google AppEngine 用于 Web 应用程序 或 Java WebStart 用于客户端软件 这两个想法似乎在概念上很好地互补 然而 OSGi 标
  • 对 Primefaces 中的树节点进行排序

    我正在使用 JSF 2 1 和 Primefaces 3 3 我正在使用 primefaces 树组件从数据库中创建树 我想按字母顺序对各级树节点进行排序 请帮我解决这个问题 我们在排序时遇到了问题Comparator并发现 有一个方便的P
  • 反序列化 XML 时忽略指定的编码

    我正在尝试通过套接字读取从外部接口接收到的一些 XML 问题是 XML 标头中指定的编码错误 显示为 iso 8859 1 但实际上是 utf 16BE 据记录编码是utf 16BE 但显然他们忘记设置正确的编码 为了在反序列化时忽略编码
  • Node.js HTTP 客户端中的自动 UTF-8 编码

    我尝试使用 Node js 从远程主机加载 XML 内容 问题是像 这样的德语 元音变音 被破坏了 就像在浏览器中一样 这通常是一个简单的编码问题 但由于远程主机上的 XML 内容是用 iso 8859 2 编码的 所以我没有成功让这些字母
  • 消息:插入动态输入字段数据时未初始化的字符串偏移量:0

    我正在使用 CodeIgniter 我得到了动态选择框 从第二个选择框中 用户可以选择状态并根据状态输入字段进行显示 检查下面的屏幕截图 如果用户单击Add More然后将显示下面的选择框 现在从第二个选择框中 我选择Status one因
  • 如何使用 Symfony 表达式语言在 @Security 注释中使用类常量?

    我正在使用 Symfony 3 并且创建了一个自定义 Voter 类 我想使用访问它SensioFrameworkExtraBundle https symfony com doc current bundles SensioFramewo
  • 对重载new和delete施加限制

    是否可以对重载运算符 new 和 delete 施加一些限制 我的重载 new 在另一个文件中链接到我的测试程序 场景是 if condition is satisfied call overloaded new else call the
  • 如何在android中卸载应用程序时清除数据库

    我使用数据库来存储消息 如果我卸载我的应用程序并再次重新安装相同的应用程序 数据库保持不变 但我想清除我的数据库 如何解决这个问题 要监听卸载事件 您必须实现收到的广播 例如
  • 在条件表达式中声明变量(三元运算符)

    是否可以在条件表达式中声明变量 例如 下面的代码返回语法错误 因为我已经在条件表达式中声明了变量 x var a document getElementById userData var d a value function d lengt
  • 在 Vue.js 中构建期间传递要由 .env.[mode] 文件使用的参数(命令行)

    Goal 传递一个在构建时使用的参数 以便能够在我的 env Production 文件中使用它 或者如果不可能的话 可以让我将它用作环境变量 env 生产文件 VUE APP CLIENT ID 00 should be using wh
  • 计算一行中 NULL 属性的数量

    我想在表中添加一个新列来记录每个元组 行 值为空的属性的数量 如何使用 SQL 获取号码 例如 如果一个元组是这样的 Name Age Sex Blice 100 null 我想更新元组如下 Name Age Sex nNULL Blice
  • EclipseLink 审核/历史记录/跟踪更改

    我尝试实现一种跟踪数据更改并为我的应用程序创建历史日志的方法 因为我正在使用 EclipseLink 所以应该很容易并且可以像它们一样获得更改写在 EclipseLink FAQ 上 http wiki eclipse org Eclips