如何解决“尝试从空的一对一属性分配ID”

时间:2019-06-24 21:02:44

标签: spring-boot

我正在使用带有弹簧启动的电子图书馆应用程序,该应用程序允许用户订购书籍(这些数据保存在OrderDetails表中)。每当我尝试为特定用户保存订购的书时,都会出现以下异常:

  

org.hibernate.id.IdentifierGenerationException:尝试分配ID   从空一对一属性   [com.springboot.library.domains.OrderDetails.book]


这是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

}

书本类

@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);

}

我将非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

通常,这种情况会在尝试保留没有注释的@Id的@Entity时发生。该错误只是意味着,当休眠试图持久化时,它试图提供一个PRIMARY KEY属性,但失败了,因为它来自Book对象,该对象为null。

考虑将代码调试到持久性,并检查要持久化的实体(OrderDetails)是否具有非空主键(Book)。

关于第二个问题:

  

基于我看到的一些类似示例,我需要在OrderDetails类中初始化book属性,但是我不确定如何做到这一点:

您写的是正确的。您只需要为OrderDetails对象提供一个Book对象即可使用。由于OrderDetails对象具有Book属性(是正确的),因此您只需要在OrderDetails对象上编写一个“ setter”(一种用于设置对象内部属性的方法)即可,就像您已经做过的那样。

此外,由于OrderDetails与Book之间存在双向关系,因此请考虑使用mappedBy annotation