通过 Hibernate + JPA 在两个实体中保存 id

Save id in both entities via Hibernate + JPA

我有两个具有 OneToOne 关系的实体,如下所示:

@Entity
@Table(name = "FOO")
Foo{

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "foo")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    @JoinColumn(name = "BAR_ID")
    private Bar bar;

    // getters and setters
 }

 @Entity
 @Configurable
 @Table(name = "BAR")
 Bar{
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "FOO_ID")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    private Foo foo;

    // getters and setters
 }

在Service层,我通过在Foo中设置Bar来建立连接:

 Bar.setFoo(foo);
 barDAO.saveOrUpdate(bar);

Wich 将 foo id 保存在 Bar table 中。但相反的情况不会发生。 hibernate 是否可以保存两个 id 只制作一组?我认为这已经可以工作了

你错过了关系的另一面。

如果你说 bar.setFoo(foo) 然后你必须说 foo.setBar(bar) 或者当然你也可以在 setFoo 方法中这样做。

级联意味着它将触发对关系的操作,但是在您的情况下,由于缺少一侧,关系未完成。

你首先要搞清楚关系。正如我在这里看到的那样,您可能会尝试在 FooBar.

之间建立双向 OneToOne 关系
@Entity
@Table(name = "FOO")
Foo {

     @OneToOne(cascade = CascadeType.ALL)
     @JoinColumn(name = "BAR_ID")
     private Bar bar;

     // getters and setters
}

@Entity
@Table(name = "BAR")
Bar{

    @OneToOne(mappedBy = "bar")
    private Foo foo;

    // getters and setters
}

In the bidirectional association two sides of association exits – owning and inverse. For one to one bidirectional relationships, the owning side corresponds to the side that contains the appropriate foreign key.

这里 拥有方 Foo 而 BAR_ID 将是那个外键。在两端加入列没有意义。而 Relation 将从 Foo 级联到 Bar。而这里的反面Bar,需要用mapped by值来注解拥有方引用。

现在,如果您在 Foo 中设置 Bar 对象,它将保留 Bar 对象以及与 Foo 的映射。做相反的事情没有意义。不是吗?