Как исправить «попытку назначить идентификатор из нулевого свойства один-к-одному» - PullRequest
0 голосов
/ 25 июня 2019

Я работаю над приложением электронной библиотеки с пружинной загрузкой, которое позволяет пользователям заказывать книги (эти данные сохраняются в таблице OrderDetails).Всякий раз, когда я пытаюсь сохранить заказанную книгу для определенного пользователя, она выдает мне следующее исключение:

org.hibernate.id.IdentifierGenerationException: при попытке присвоить идентификатор из нулевого свойства «один к одному» [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, но я не уверен, как это сделать:

Нечто подобное, за исключением того, что метод setOrderDetails ожидает Set<OrderDetails>и я передаю один, и вот где я застрял

public void setBook(Book book) {
    this.book = book;
    book.setOrderDetails(this);

}

Я был бы очень признателен за любую помощь:)

1 Ответ

0 голосов
/ 25 июня 2019

Обычно это происходит при попытке сохранить @Entity без аннотации @Id, что имеет место. Эта ошибка просто означает, что, когда hibernate пытается сохраниться, он пытается найти свойство PRIMARY KEY и завершается ошибкой, потому что это происходит из объекта Book, который является нулевым.

Рассмотрите возможность отладки вашего кода до точки персистентности и проверки там, имеет ли сущность, которую нужно сохранить (OrderDetails), ненулевой первичный ключ (Book).

По второму вопросу:

Исходя из некоторых похожих примеров, которые я видел, мне нужно инициализировать свойство книги в классе OrderDetails, но я не уверен, как это сделать:

То, что вы написали, правильно. Вам просто нужно дать объекту OrderDetails объект Book для работы с ним. Поскольку объект OrderDetails имеет свойство Book (что является правильным), вам просто нужно написать «установщик», который является методом для установки внутреннего свойства объекта, в объект OrderDetails, как вы уже сделали.

Кроме того, поскольку у вас имеются двунаправленные отношения между OrderDetails и Book, рассмотрите возможность использования аннотации mappedBy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...