gpt4 book ai didi

java - Hibernate - 一对一 IdentifierGenerationException

转载 作者:行者123 更新时间:2023-12-02 01:23:54 27 4
gpt4 key购买 nike

我有两个如下所示的实体

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "foo")
@Audited
@AuditOverride(forClass = Auditable.class)
public class Foo extends Auditable implements Serializable {

@Id
@Column(name = "id")
private Long id;

//other fields

@ToString.Exclude
@EqualsAndHashCode.Exclude
@NotAudited
@OneToOne(mappedBy = "foo",
fetch = FetchType.LAZY,
cascade = CascadeType.ALL,
orphanRemoval = true,
optional = false)
private FooDetail fooDetail;

}

@Data
@Entity
@Table(name = "foo_detail")
public class FooDetail implements Serializable {

@Id
@Column(name = "id")
private Long id;

//other fields

@ToString.Exclude
@EqualsAndHashCode.Exclude
@MapsId
@JoinColumn(name = "id", referencedColumnName = "id", nullable = false)
@OneToOne(fetch = FetchType.LAZY)
private Foo foo;

}

我这样坚持Foo

Foo foo = new Foo();
foo.setId(1L);

FooDetail fooDetail = new FooDetail();
fooDetail.setId(1L);

foo.setFooDetail(fooDetail);
fooDetail.setFoo(foo);

fooRepository.save(i);

save方法被调用时IdentifierGenerationException被抛出。它说“尝试从 null 一对一属性 [package.FooDetail.foo] 分配 id”。

更有趣的是,当我在父实体(Foo)上使用序列生成器时,它工作得很好。但如果我手动提供 id 则会引发此异常。

我做错了什么?

环境

  • hibernate 5.3.10.Final
  • Spring Boot 2.1.7.RELEASE

最佳答案

您可以删除 FooDetail 中的 @JoinColumn 并且它会起作用,但 id 列将被命名为 foo_id,您可能不希望那个。

要解决这个问题,您需要做的就是将 @MapsId 更改为 @MapsId("id") 以让它知道现在是 id 列(因为您正在使用 @JoinColumn 更改它)。

关于java - Hibernate - 一对一 IdentifierGenerationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57598693/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com