JPA OneToOne 关系自动创建

JPA OneToOne relation automatic creation

我担心之前可能有人问过这个问题,但我没有找到或不理解类似问题的答案。

我有这个table要约

@Entity
public class Offerte extends BaseEntity{

    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="dossier")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @NotNull
    private Dossier dossier;

与 table 档案有 OneToOne 连接,在创建要约时我希望自动创建一个档案。

@Entity
public class Dossier extends BaseEntity{

    @OneToOne(fetch=FetchType.LAZY, mappedBy="dossier")
    @NotNull
    private Offerte offerte;

我已经尝试使用 generationtype auto 来做到这一点,但我一直违反

List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='may not be null', 

是否可以让这个关系自动生效?

编辑

river 提出的 java 解决方案

@Entity
public class Offerte extends BaseEntity{
    @OneToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name="dossier")
    @NotNull
    private Dossier dossier = new Dossier();

给出如下错误

javax.validation.ConstraintViolationException: Validation failed for classes [be.ugent.lca.data.entities.Dossier] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=offerte, rootBeanClass=class be.ugent.lca.data.entities.Dossier, messageTemplate='{javax.validation.constraints.NotNull.message}'}
]

为了在您创建新的 Dossier 对象时创建报价 - 您应该直接下拉至 java 解决方案:

public class Dosier {
    @OneToOne(cascade = CascadeType.ALL)
    @NotNull
    private Offerte offerte = new Offerte(....);
}

这将产生以下后果:

  • 每当创建新的 Dosier 对象(通过调用构造函数)时,offerte 变量将作为新 Offerte 对象构造的一部分填充。
  • 当您保存这样创建的 Dosier 时,它会保存 offerte 对象(这就是 cascade 选项的用途)
  • 当您加载创建的档案时 - JPA 将加载要约对象并正确初始化档案