【发布时间】:2021-07-22 13:36:36
【问题描述】:
我正在创建简单的 REST API。我想通过 post 方法创建一个对象。对象包含其他对象。当我想发布它时,我收到了EntityNotFoundException,它在嵌套对象不存在时抛出。
我要发布的对象的代码:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
private String title;
@ManyToOne
private Author author;
@Id
@Column(unique = true)
private String isbn;
}
该对象的服务:
@Service
@RequiredArgsConstructor
public class BookServiceImpl implements BookService {
private final BookRepository bookRepository;
private final AuthorRepository authorRepository;
@Override
public Book save(Book book) {
try {
Author byId = authorRepository.getById(book.getAuthor().getId());
} catch (EntityNotFoundException e) {
authorRepository.save(book.getAuthor());
}
return bookRepository.save(book);
}
}
使用 post 方法后出现此错误:
javax.persistence.EntityNotFoundException: Unable to find com.jakubkolacz.qualificationTask.domain.dao.Author with id 0
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:163) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:216) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
我认为使用 try catch 来检查对象是否存在,并在必要时保存作者会有所帮助,但它没有。 我的问题是我应该在哪里添加一些代码来解决问题。我明白为什么会这样,但不知道如何解决。必要的是我不能创建手动添加作者的服务,只有在添加新书时才需要将它们添加到 repo。
【问题讨论】:
-
您需要使用级联插入。例如在这里解释:Hibernate: How to insert OnetoMany children by cascade
-
除了@Piotr 的提示:try/catch 可能需要更多的事务处理,如您所愿。
-
所以我只需要将它添加到我的代码中:@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) ?