休眠剂量未从序列中获取 FK 密钥的默认值

Hibernate dose not get default value of a FK key from sequence

提问人:Marek Cupak 提问时间:11/13/2021 最后编辑:Marek Cupak 更新时间:11/13/2021 访问量:170

问:

在我的 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 控制台检查数据库内容时,即使在那里值也是空的,尽管插入了预先填充的外键没有问题。nulldata.sql

Hibernate 生成带有 s 的插入,DB 支持它,而不是使用默认的 sequence.next,因此新插入的实例也带有 null 而不是实例化的 ChildEntity。null

@GeneratedValue在现场不起作用。private ChildEntity childEntity;

我该如何解决?

hibernate jpa 外键 序列 默认值

评论

0赞 grigouille 11/13/2021
您没有设置 childEntity,因此它在数据库中为 null。这很正常。
0赞 Marek Cupak 11/15/2021
@grigouille“child_entity_id整数默认值 child_entity_id_seq.nextval”被忽略,这就是问题所在
0赞 grigouille 11/15/2021
尝试将 NOT NULL 添加到child_entity_id
0赞 Marek Cupak 11/24/2021
@grigouille它抛出 null 不允许给定字段异常。似乎剩下的唯一选择只是以编程方式设置对子实体的引用,因为默认的 sequence.nextval 被忽略了。

答: 暂无答案