我最近开始使用Spring Boot的项目。我仍在学习一些概念,但是一些与数据访问有关的事情使我有些困扰。让我举个例子。
我有几个实体:
@Entity
class Book {
@Id
private Long idBook;
private String title;
@ManyToOne
@JoinColumn(name = "idAuthor")
private Author author;
}
@Entity
class Author {
@Id
private Long idAuthor;
private String name;
@OneToMany(fetch = FetchType.LAZY)
private List<Book> books;
}
为简单起见,假设一本书只能有一位作者。
书库是一个简单的界面:
public interface BookRepository extends JpaRepository<Book, Long> {}
我也有图书的DTO:
class BookDTO {
private Long idBook;
private String title;
private idAuthor;
}
当客户要保存一本书时,他将发送一个json:
{
"idBook":328,
"title":"The Martian Chronicles",
"idAuthor":56
}
每次有人需要保存一本书时,他都会将DTO转换为实体并在保存之前获取作者:
entityBook.setId(dtoBook.getId());
entityBook.setTitle(dtoBook.getTitle());
entityBook.setAuthor(authorRepository.getById(dtoBook.getIdAuthor()));
bookRepository.save(entityBook);
对我来说,这似乎是浪费资源,因为仅需要保存idAuthor。这是一个简单的例子。我面对的现实生活情况要复杂得多,有时可能会令人沮丧。
我使用方法 EntityManager :: getReference 找到了解决方案。
persisting a new object without having to fetch the associations
Hibernate persist entity without fetching association object. just by id
问题(如果我不理解的话)是:在存储库之外获取EntityManager引用(通过@PersistenceContext注入)不是一个好习惯,并且从dto到实体的转换是在调用之前的一层上进行的到存储库。
是否有另一种方法可以完成此操作而无需访问上层的EntityManager?
答案 0 :(得分:0)
您可以尝试通过以下方式设置作者:
Author currentAuthor = new Author();
currentAuther.setIdAuthor(dtoBook.getIdAuthor());
entityBook.setAuthor(currentAuthor);
如果现有的具有相同的主键,则不会创建新的Author。设置此设置时,请检查级联类型