jpa 原始保存时,父对象和子对象使用相同的新生成id

ukqbszuj  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(115)

我有许多对象,它们都链接到1-2-1庄园中的父表。
所有内容都是1-2-1,并且都链接到根项目表,我在一些子表中使用ProjectId作为主键。
在我的代码中,我遇到了一个问题,就是让项目id向下传播;parent --〉child我得到一个错误,指出“在调用保存()之前,必须手动分配这个类的id”,我理解这意味着我不能在没有项目ID的情况下添加子类,但是这是一个save()调用。
是否可以保存一个包含子对象的对象,这些子对象同时共享父对象生成的ID?我觉得用所有子对象创建对象并触发保存一次而不是手动处理事务会更干净,因为我目前唯一的选择是多次保存,一次保存在父对象上,然后手动将新ID设置到所有子对象中并触发另一次保存。
家长:

public class Project {

    @Id
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @GeneratedValue(generator = "uuid")
    @Column(columnDefinition = "UNIQUEIDENTIFIER")
    @Type(type = "uuid-char")
    private UUID projectId;

    @OneToOne(
            fetch = FetchType.EAGER,
            cascade = {
                    CascadeType.ALL,
            }, mappedBy = "project")
    private AdditionalInformation additionalInformation;

    private String someField;

    //Getters and setters
}

孩子:

public class AdditionalInformation {

    @Id
    @Column(columnDefinition = "UNIQUEIDENTIFIER", nullable = false)
    @Type(type = "uuid-char")
    private UUID projectId;

    @OneToOne(fetch = FetchType.LAZY)
    private Project project;
    
    private String someData;

    //Getters and setters etc...
}

测试将显示如下内容

Project project = new project();

AdditionalInformation ai = new AdditionalInformation();

ai.setSomeData("Test set");

project.setAdditionalInformation(ai);
project.setSomeField("Test field set");

Project p = projectRepo.save(project);

assertEquals(p.getProjectId(), p.getAdditionalInformation.getProjectId());
oxf4rvwz

oxf4rvwz1#

您是否尝试过在关系中MapID字段,以便JPA根据引用值为您设置它?这被称为派生ID,根据实体中的需要,有多种方法可以执行此操作:

public class AdditionalInformation {

    @Id
    private UUID projectId;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn("projectid")
    @MapsId
    private Project project;
    
    private String someData;

    //Getters and setters etc...
}

或者,您可以将项目标记为ID:

public class AdditionalInformation {

    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn("projectid")
    private Project project;
    
    private String someData;

    //Getters and setters etc...
}

在这两种情况下,您都将使用UUID projectId值作为AdditionalInformation主键,以进行按键查找。

相关问题