#java #hibernate
#java #переход в спящий режим
Вопрос:
@Entity
@Table
public class Book {
@Id @GeneratedValue @Column private Long bookId;
@Column private String name;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name="bookId")
private List<Chapter> chapters=new ArrayList<Chapter>();
.....
@Entity
@Table
public class Chapter {
@Id @Column @GeneratedValue
private Long cid;
@Column private String name;
@Column private Long bookId;
....
Какую аннотацию я должен использовать в Chapter.BookID для ссылки на книгу.BookID, так что chapter.bookid примет сгенерированное значение Book.Идентификатор книги при вставке новой книги .
Book bk=new Book();
bk.setName("b1");
Chapter ch=new Chapter();
ch.setName("b1c1");
bk.getChapters().add(ch);
Я получаю эту ошибку
Переход в спящий режим: вставка в значения Book (name) (?)
Переход в спящий режим: вставка в значения главы (BookID, name) (?, ?)
19:56:59,094 ОШИБКА JDBCExceptionReporter:234 — Столбец ‘BookID’ не может быть нулевым
Ответ №1:
Вам пришлось бы установить Chapter.bookId
самостоятельно или изменить ссылку в Chapgter
с Long
на Book
, добавить @ManyToOne
аннотацию и установить ссылку на книгу вручную.
В этом случае фактически владельцем отношения является сторона Chapter
, т. е. глава определяет, к какой книге она принадлежит.
Комментарии:
1. ДА. В этом случае большинство людей добавят удобный метод в Book (называемый addChapter или что-то подобное), который сочетает добавление главы в коллекцию и установку ссылки на книгу главы.
Ответ №2:
Используйте @Column (nullable= true), если вам действительно нужно значение null, в противном случае, как было сказано в предыдущем ответе — вам нужно установить его вручную, добавление главы в список не устанавливает BookID