当前位置: 首页 > 知识库问答 >
问题:

使用hibernate envers创建自定义修订实体时违反完整性约束

利永年
2023-03-14

我有一个应用程序使用了hibernate envers,并对一些实体进行了审计。

我想在审计表中添加一些额外的列,并遵循我在多个博客中找到的标准说明。

@Entity
@RevisionEntity(UserRevisionListener.class)
public class UserRevEntity extends DefaultRevisionEntity {
    private String username;

    public String getUsername() { return username; }

    public void setUsername(String username) { this.username = username; }
}

则修订侦听器:

public class UserRevisionListener implements RevisionListener {
    @Override
    public void newRevision(Object revisionEntity) {
        UserRevEntity exampleRevEntity = (UserRevEntity) revisionEntity;
        exampleRevEntity.setUsername("TEST");
    }
}

问题是,当应用程序保存一个实体(我们称之为MyEntity)时,它违反了数据库上的外键约束。

我得出的结论是,到目前为止,envers写入了REVINFO表,但现在通过查看JPA发送到db的查询,我看到它写入了UserRevTable。因为MyEntity被持久化的表有一个引用REVINFO的外键约束,它会导致约束冲突。

请帮忙,提前谢谢。

共有1个答案

汪弘光
2023-03-14

最简单的解决方案是这样做

@Entity
@Table(name = "REVINFO")
@RevisionEntity(UserRevisionListener.class) 
public class UserRevEntity extends DefaultRevisionEntity {
  ...
}

如果您注意到,我已经显式地添加了一个@table注释来解决该问题。

您在使用自定义修订实体时遇到这种情况的原因与实体发现有很大关系。

当您提供自己的自定义修订实体时,该实体映射实际上首先被ORM发现,因为它是域模型中的一个真实实体。这意味着Envers必须在引导过程中检查ORM具有的实体映射,如果在@revisionEntity中找到了一个实体映射,那么我们就不提交默认配置的Hibernate XML映射。

其副作用是ORM已经确定了来自自定义修订实体的所有映射数据的表名、实体名、列名等,这些属性是我们在此引导发生时技术上不能更改的,这些数据已经被正常ORM引导过程绑定。

因此,如果您想将自定义的修订实体覆盖在默认表上,并根据需要添加一个新列来更改它;您需要在自定义实体映射的注释中明确地显示,并强制ORM使用特定的表名,否则它将使用默认的命名策略策略,这正是您开始看到它使用userreventity而不是revinfo的原因。

添加@table(name=“revinfo”),它将像往常一样插入revinfo

 类似资料:
  • 我正在使用Hibernate 4.0最终版和ojdbc6来开发我的网络应用程序。一切都好,除了当我试图插入一个新的父母/孩子的关系。首先,这些是实体: 让我们看看这两个场景: 员工已存在,我尝试向其添加新地址-- 这是事务处理程序: 你可以想象,2.b的案子是我关心的。我已经调试了事务,这是我调用保存()方法(在DAO类中)时得到的: 会议结束了。saveOrUpdate(employee)方法成

  • 照明\database\queryexception SQLSTATE[23000]:完整性约束违反:19 NOT NULL约束失败:users.password(SQL:插入“users”(“name”、“email”、“username”、“updated_at”、“created_at”)值(MADHUP KUMAR,Chandrashivam99@gmail.com,Vansh123,20

  • 问题内容: 我正在尝试使用ALTER IGNORE TABLE + UNIQUE KEY从MySQL表中删除重复项。MySQL文档说: IGNORE是标准SQL的MySQL扩展。如果新表中的唯一键上有重复项,或者在启用严格模式时出现警告,则它控制ALTER TABLE的工作方式。如果未指定IGNORE,则在发生重复键错误时,副本将中止并回滚。如果指定了IGNORE,则只有第一行用于唯一键重复的行。

  • 问题内容: 我正在使用Hibernate 4.0 Final和ojdbc6开发我的Web应用程序。一切正常,除非我尝试插入新的父/子关系。首先,这些是实体: 让我们看看这两种情况: 一名员工已经存在,我尝试向其添加新地址->正常工作。 员工不存在,我尝试创建一个新员工。两种不同的情况: a)我只插入一名雇员(无地址)->可以正常工作。 b)我插入并添加了employee及其地址-> 失败 。我必须

  • 问题内容: 我正在尝试解析Web请求并将其保存到数据库。我有3个模型,第一个节点是virtualDocument。这是uniq表(根据请求url)。VirtualRequest表具有所有erquest主体,而HttpHeaderList表根据其virtualRequest bean ID具有所有thhp标头。 当我尝试保存第一个日志时,出现了这样的错误; 这是VirtualDocument bea

  • 问题内容: 嗨,我正在Oracle SQL开发人员中开发数据库,​​试图从另一个表访问foriegn键。我目前正在使用以下CREATE语句创建的ItemOrdered表 如您所见,我具有以下前键Ords和BeltID。 现在,当我尝试运行以下语句时 它给了我以下错误 违反-找不到父密钥02291。00000-“违反完整性约束(%s。%s)-找不到父密钥” 如果需要,我已经提供了Ords CREAT