提问人:Marek Cupak 提问时间:11/13/2021 最后编辑:Marek Cupak 更新时间:11/13/2021 访问量:170
休眠剂量未从序列中获取 FK 密钥的默认值
Hibernate dose not get default value of a FK key from sequence
问:
在我的 Spring Boot (v2.5.3) 项目中,Hibernate 不遵循父实体中 FK 键(来自序列)的默认值,也没有获取子实体实例。
父实体:
@Data
@Entity
@Table(name = "parent_entity")
public class ParentEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
private Integer id;
...
@Column
private String str1;
@Column
private String str2;
...
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "child_id", referencedColumnName = "id")
@Fetch(value = FetchMode.JOIN)
private ChildEntity childEntity;
}
相关片段:schema.sql
CREATE SEQUENCE child_entity_id_seq INCREMENT BY 1 MINVALUE 1 MAXVALUE 5 START WITH 1 CYCLE NOCACHE;
CREATE TABLE parent_entity (
id INTEGER AUTO_INCREMENT,
child_entity_id INTEGER DEFAULT child_entity_id_seq.nextval,
...
CONSTRAINT pk__parent_entity__id PRIMARY KEY (id),
CONSTRAINT fk__child_entity_id__child_id FOREIGN KEY (child_entity_id) REFERENCES child_entity(id),
...
);
相关片段:data.sql
INSERT INTO parent_entity(code, name)
VALUES ('sample string 1.1', 'sample string 1.2');
INSERT INTO parent_entity(code, name)
VALUES ('sample string 2.1', 'sample string 2.2');
...
我确实得到了很好的初始化数据库,有 2 个 ParentEntity 实例,填充了业务字段(str1、str2),生成了它们的 ID 以及对 ChildEntity 的两个非 null 引用,根据顺序。
但是如果我执行:
class ParentEntityTest {
@Autowired
ParentRepository parentRepository;
@Test
void insert() {
ParentEntity parentEntity1 = parentRepository.saveAndFlush(new ParentEntity().setStr1("sample1"));
ParentEntity parentEntity2 = parentRepository.saveAndFlush(new ParentEntity().setStr1("sample2"));
assertTrue(dte1.getId() < dte2.getId());
assertNotNull(dte1.getChildEntity());
...第二个断言失败 - 对 ChildEntity 的引用是 当我使用 H2 控制台检查数据库内容时,即使在那里值也是空的,尽管插入了预先填充的外键没有问题。null
data.sql
Hibernate 生成带有 s 的插入,DB 支持它,而不是使用默认的 sequence.next,因此新插入的实例也带有 null 而不是实例化的 ChildEntity。null
@GeneratedValue
在现场不起作用。private ChildEntity childEntity;
我该如何解决?
答: 暂无答案
评论