Использование CascadeType в гибернации

#hibernate #spring

#переход в режим гибернации #весна #spring

Вопрос:

Я работаю с Hibernate Spring и JSF

У меня возникает проблема, когда я использую отношения типа @OneToMany в режиме гибернации. Например:

 @Entity
@Table(name = "book")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String description;
    private String image;
    private int numberOfPages;
    private Date releaseDate;
    private String title;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "category_id")
    private Category category;
  

Когда я удаляю CascadeType.ВСЕ и сохраните книгу, содержащую категорию, идентификатор категории становится нулевым.

Кто-нибудь может помочь мне решить эту проблему?

Редактировать: Это мой модульный тест, который вызывает ошибку при восстановлении CascadeType.ALL

 BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");
Category category = new Category();
category.setTitle("Title");
Book book = new Book();
book.setCategory(category);
bookDao.save(book);
long id = book.getCategory().getId();
assertTrue(id > 0);
  

Комментарии:

1. Это категория, которую содержит книга, которая уже есть в базе данных?

2. это мой модульный тест, который вызывает ошибку при восстановлении CascadeType. ВСЕ BookDAO BookDAO = (BookDAO) ApplicationContext.getBean(«BookDAO»); Категория category = новая категория (); категория.setTitle(«Заголовок»); Книга book = новая книга(); book.setCategory(категория); BookDAO.save(книга); длинный идентификатор = книга.getCategory().getId(); assertTrue(id> 0);

3. Вы должны опубликовать дополнительный код, отредактировав свой вопрос, а не помещая его в комментарий. Я взял на себя смелость задать вам этот вопрос. Вы можете удалить этот комментарий.

Ответ №1:

Взгляните на «Каскадный жизненный цикл», чтобы понять, как работает каскадирование. Если вы не назначаете идентификаторы вручную, объект получает идентификатор, назначенный только при его сохранении. Если вы каскадируете сохранения из книги в категорию, то при сохранении Книги также сохраняется Категория. Без каскадирования Категория не сохраняется, и поэтому у нее нет идентификатора.