必须手动分配一对一的 ID

One-to-One ids must be manually assigned

我想知道如何在保存一对一实体时制作 Hibernate 级联 ID。

@Entity
@Table(name = "foo")
class Foo {
    @Id
    @Column(name = "foo_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "foo_seq")
    private Integer fooId;

    // ...

    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "foo")
    private Bar bar;

    // ...

    public void setBar(Bar bar) {
        this.bar = bat;
        if (bar != null) {
            bar.setFoo(this);
            bar.setFooId(getFooId());
        }
    }

}

@Entity
@Table(name = "bar")
class Bar {

    @Id
    @Column(name = "foo_id")
    // this is the foo's id, the foreign key is the primary key of this table
    private Integer fooId;

    @OneToOne(fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn
    private Foo foo;

    // ...

}

好吧,当我在没有 Bar 的情况下保存 Foo 的实例时,然后设置 Bar 的实例并再次保存它,但如果我尝试全部保存一旦它说 ids for this class must be manually assigned before calling save.

Foo foo = new Foo();
// foo.set...
repository.save(foo); // I do not want to save twice, I want to remove it
Bar bar = new Bar();
// bar.set...
foo.setBar(bar);
repository.save(foo);

我该如何解决这个问题?我不需要它是双向的,但这必须有可能从 Foo 中得到 Bar,就像 中的讨论一样,但这次 id 与 Foo table.

之所以会这样,是因为 Hibernate 在保存实体时生成 fooId 的值,而不是在此之前。因此,即使您在 setBar() 方法中分配 fooId 它实际上将 NULL 分配给 Bar.fooId 并且因为您没有定义和 Generation Strategy on Bar.fooId 你收到了那个错误。如下所示修改 Bar class 然后重试,错误应该消失:

 @Id
    @Column(name = "foo_id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer fooId;