在本方案中:
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
(id
bigint(20)不为空,revision
int(11)不为空,action
tinyint(4)默认为空,主键(id
,revision
),键fktoml4ns3581arnt5f7i1srxai
(revision
),约束
而且
创建表testentity_strings_aud
(revision
int(11)不为NULL,testentity_id
bigint(20)不为NULL,strings
varchar(255)不为NULL,action
tinyint(4)默认为NULL,主键(revision
,testentity_id
,strings
),约束
问题出在第二个审核表(testentity_strings)上。它对列“strings”设置一个约束(不是NULL),即使在主表中strings允许NULL。
我的业务要求是允许空字符串。如何在Envers中覆盖此行为?
简单的回答是你不能。
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子句语句 给出了一个列列表,该列列表在被引用