在SpringData中保留实体,而无需获取关联

时间:2018-11-28 18:28:46

标签: java spring jpa

我最近开始使用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?

1 个答案:

答案 0 :(得分:0)

您可以尝试通过以下方式设置作者:

Author currentAuthor = new Author();
currentAuther.setIdAuthor(dtoBook.getIdAuthor());
entityBook.setAuthor(currentAuthor);

如果现有的具有相同的主键,则不会创建新的Author。设置此设置时,请检查级联类型