Ошибка «object references an unsaved transient instance — save the transient instance before flushing» в Hibernate обычно возникает, когда есть связанный объект, которому не было присвоено уникальное значение идентификатора, и этот объект пытаются использовать до его сохранения.
Рассмотрим типичный пример. Имеется сущность Book
, у которой есть связанный объект Author
:
public class Book { private Long id; private String title; private Author author; //геттеры, сеттеры... }
public class Author { private Long id; private String name; //геттеры, сеттеры... }
При попытке сохранить книгу с новым автором, который еще не был сохранен в базе данных, возникает указанная ошибка:
Author author = new Author(); author.setName("New Author"); Book book = new Book(); book.setTitle("New Book"); book.setAuthor(author); session.save(book); //ошибка
Чтобы исправить данную проблему, необходимо сначала сохранить связанный объект Author
, а затем объект Book
:
Author author = new Author(); author.setName("New Author"); session.save(author); //сначала сохраняем автора Book book = new Book(); book.setTitle("New Book"); book.setAuthor(author); session.save(book); //теперь сохраняем книгу
Теперь Hibernate знает идентификатор Author
, и книга успешно сохраняется.
Важно помнить, что при выполнении операций с базой данных в Hibernate все связанные объекты должны быть в «сохраненном» состоянии, то есть иметь уникальный идентификатор, прежде чем они могут быть использованы в других операциях.
Добавить комментарий