однонаправленное отношение «один ко многим» без таблицы объединения

#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