【发布时间】:2019-01-25 09:06:38
【问题描述】:
在这种情况下:
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 按预期创建两个表:
创建表testentity (
id bigint(20) 非空,
主键 (id)
) ENGINE=InnoDB 默认字符集=utf8;
和
创建表testentity_strings (
TestEntity_id bigint(20) 非空,
strings varchar(255) 默认为空,
键FK6gvnp6uhj6p14qb8jr7w4a4sc (TestEntity_id),
约束 FK6gvnp6uhj6p14qb8jr7w4a4sc 外键 (TestEntity_id) 参考 testentity (id)
) ENGINE=InnoDB 默认字符集=utf8;
Envers 还创建了两个表:
创建表testentity_aud (
id bigint(20) 非空,
revision int(11) 非空,
action tinyint(4) 默认为空,
主键 (id,revision),
键FKtoml4ns3581arnt5f7i1srxai (revision),
约束 FKtoml4ns3581arnt5f7i1srxai 外键 (revision) 参考 revinfo (REV)
) ENGINE=InnoDB 默认字符集=utf8;
和
创建表testentity_strings_aud (
revision int(11) 非空,
TestEntity_id bigint(20) 非空,
strings varchar(255) 非空,
action tinyint(4) 默认为空,
主键 (revision,TestEntity_id,strings),
约束 FKadlc041c3dxra6fmfxsku0fuh 外键 (revision) 参考 revinfo (REV)
) ENGINE=InnoDB 默认字符集=utf8;
问题在于第二个审计表(testentity_strings)。即使在主表中的字符串允许为空,它也会在“字符串”列上设置一个约束(非空)。
我的业务需求是允许空字符串。如何在环境中覆盖此行为?
【问题讨论】:
标签: java hibernate hibernate-envers