必须手动分配一对一的 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;
我想知道如何在保存一对一实体时制作 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
,就像
之所以会这样,是因为 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;