我正在开发一个带有spring boot的电子图书馆应用程序,它允许用户订购图书(这些数据保存在OrderDetails表中)。每当我尝试为某个用户保存已订购的图书时,都会出现以下异常:
org.hibernate.id.IdentifierGenerationException:尝试从空的一对一属性com.springboot.library.domains.OrderDetails.book中分配id
下面是OrderDetails类:
@Entity
public class OrderDetails{
@EmbeddedId
private OrderDetailsKey key;
@ManyToOne
@MapsId("bookId")
@JoinColumn(name = "book_id")
private Book book;
@ManyToOne
@MapsId("userId")
@JoinColumn(name = "app_user_id")
private AppUser appUser;
private Integer quantity;
public void setBook(Book book) {
this.book = book;
}
// other getters and setters
}
Book类
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", insertable = false, updatable = false)
private Long id;
private String isbn;
private String title;
//some other fields
@OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true)
private Set <OrderDetails> orderDetails;
//getters and setters
**strong text**}
根据我看到的一些类似示例,我需要初始化OrderDetails类中的book属性,但我不确定如何做到这一点:
除了setOrderDetails
方法需要一个Set<OrderDetails>
,而我只传递了一个,这就是我被卡住的地方
public void setBook(Book book) {
this.book = book;
book.setOrderDetails(this);
}
如果有任何帮助,我将非常感谢:)
发布于 2019-06-25 09:44:13
通常,当试图持久化没有@Id注释的@Entity时,就会发生这种情况。这个错误仅仅意味着,当hibernate试图持久化时,它试图提供一个主键属性,但它失败了,因为它来自Book对象,该对象为null。
考虑将代码调试到持久化点,并检查要持久化的实体(OrderDetails)是否具有非空主键(Book)。
关於第二项问题:
根据我看到的一些类似的例子,我需要在OrderDetails类中初始化
属性,但我不确定该怎么做:
你写的是对的。您只需要为OrderDetails对象提供一个要使用的Book对象。因为OrderDetails对象有一个Book属性(这是正确的),所以您只需要编写一个"setter",这是一个在OrderDetails对象上设置对象内部属性的方法,就像您已经做的那样。
此外,由于您在OrderDetails和Book之间具有双向关系,因此可以考虑使用mappedBy annotation。
https://stackoverflow.com/questions/56743909
复制相似问题