具有相同ID的OneToOne映射

问题描述 投票:1回答:2

我有两个实体类:

@Data @Entity
public class MainEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer mainId;

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private SubEntity subEntity;
}

@Data @Entity
public class SubEntity {

    @Id
    private Integer mainId;
}

我在this answer找到了这个架构。我认为它可以解决所有问题,但当我试图保存填充的MainEntity时,我遇到了下一个异常:

org.hibernate.id.IdentifierGenerationException:在调用save()之前必须手动分配此类的ID:com.example.demo.SubEntity

我究竟做错了什么?因为我使用一对一映射,所以我不希望在我的子实体中有另一个主键。此外,我不需要从SubEntityMainEntity的反向链接。

我用来测试它的代码片段:

@Bean
public CommandLineRunner test(MainEntityRepository repo) {
    return args -> {
        MainEntity main = new MainEntity();
        main.setSubEntity(new SubEntity());
        repo.save(main);

        repo.findAll().forEach(System.out::println);
    };
}

你可以在github here上找到我的示例项目。

java spring hibernate spring-boot
2个回答
1
投票

试试这个:

@Data @Entity
public class MainEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer mainId;

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "mainEntity", optional = false)
    @PrimaryKeyJoinColumn
    private SubEntity subEntity;
}

@Data @Entity
public class SubEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer mainId;

    @MapsId
    @JoinColumn(name = "mainId")
    @OneToOne(optional = false)
    private MainEntity mainEntity;
}

0
投票

问题是你不能插入一个带空值的PK,因为你从未设置过id,hibernate告诉你必须在保存实体之前这样做。

解:

1-在保存实体之前手动设置ID。

2-使用@GeneratedValue(strategy = GenerationType.IDENTITY)激活@Id属性tio自动生成该值。

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.