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

Hibernate Envers在主键中包含列,即使列不是主表中的键

荣沈义
2023-03-14

在本方案中:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.envers.Audited;

@Entity
@Audited
public class TestEntity implements Serializable {

    @Id
    private Long id;

    @ElementCollection
    private List<String> strings = new ArrayList<>();

    public Long getId() {
        return id;
    }

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

    public List<String> getStrings() {
        return strings;
    }

    public void setStrings(List<String> strings) {
        this.strings = strings;
    }
}

Hibernate按预期创建了两个表:

Envers还创建两个表:

创建表testentity_aud(idbigint(20)不为空,revisionint(11)不为空,actiontinyint(4)默认为空,主键(idrevision),键fktoml4ns3581arnt5f7i1srxai(revision),约束

而且

创建表testentity_strings_aud(revisionint(11)不为NULL,testentity_idbigint(20)不为NULL,stringsvarchar(255)不为NULL,actiontinyint(4)默认为NULL,主键(revisiontestentity_idstrings),约束

问题出在第二个审核表(testentity_strings)上。它对列“strings”设置一个约束(不是NULL),即使在主表中strings允许NULL。

我的业务要求是允许空字符串。如何在Envers中覆盖此行为?

共有1个答案

夏侯弘光
2023-03-14

简单的回答是你不能。

Envers处理元素集合的方式与ORM不同。相反,Envers为该元素集合构造一个完全独立的实体映射,并通过HBM将所述映射提供给ORM。

我们这样做有两个原因,但最主要的原因是它允许用户配置映射,这样元素集合可能会被审计,因为拥有实体的其余部分不会被审计。因为我们提供的映射是集合的实体映射,所以HBM要求我们必须为ORM提供一个主键配置。

如果您认为这些值不值得审计,那么您可以在元素集合上放置@notaudited来绕过这个问题。

 类似资料:
  • 我将在请求中传递className,在实体中存储class Name字段,就像上面一样。 主键值应附加我的类名。我们是怎么做的。 我有办法,1。首先插入记录%2。使用主键值更新同一记录。 我希望这是一个坏的方法,有没有可能做的单一保存调用?如果不是,将有什么有效的工作围绕实现这一点。

  • 问题内容: 我正在尝试学习如何使用键并打破习惯,即我所有表中的所有行都必须具有类型ID。同时,我也在进行多对多关系,因此在需要协调关系的表的任一列上要求唯一值会妨碍这一点。 我如何在表上定义主键,以便任何给定的值都可以在任何列中重复,只要永不完全重复所有列中的值组合即可? 问题答案: 从CREATE TABLE语法页面引用: 主键可以是多列索引。但是,您不能使用列规范中的PRIMARY KEY键属

  • 我有一个表,其中有几个列组成了主键。存储的数据的性质允许其中一些字段具有值。我把桌子设计成这样: 但是,当我运行时,它显示如下: 在插入值时,我一直收到错误。 列“Field2”不能为空 这是因为作为主键一部分的字段不能为空吗?除了对< code>NULL使用“0”之外,我还有什么选择?

  • 问题内容: 在我的Java应用程序中,我正在使用hibernate .hbm文件访问数据库。是否可以更新表中的主键“ id”列;我的.hbm文件中的“ id”列如下所示: 问题答案: 尝试这个: 或只使用sql:

  • 问题内容: 因此,我正在为测试练习一些sql编码,但是我无法获得外键来引用主键。 这是无效的表格: 这是它引用的表: 每当我尝试运行脚本时,它总会返回: 错误报告 -SQL错误:ORA-02270:此列列表 02270没有匹配的唯一或主键。00000-“此列列表没有匹配的唯一或主键” 原因:CREATE / ALTER TABLE中的REFERENCES子句语句 给出了一个列列表,该列列表在被引用