java - 在 Spring Data 中持久化实体,无需获取关联

标签 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 注入(inject))并不是一个好的做法,并且从 dto 到实体的转换是在调用存储库之前在层上进行的。

是否有其他方法可以在不访问上层 EntityManager 的情况下完成此操作?

最佳答案

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

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

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

关于java - 在 Spring Data 中持久化实体,无需获取关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53525875/

相关文章:

java - 在标题数据和第一列数据匹配的位置选择一个文本框

java - Spring SimpleJdbcCall 默认(可选)参数

java - 如何在不读取 application.properties 的情况下以编程方式初始化辅助/其他数据源

java - 日志文件中的 "Register the existing object ..."是什么意思?

java - Android Httpclient [NoSuchMethodError :org. apache.http.entity.ContentType.create]

java - Java中OutputStream中的String中的引号问题

Java简单形状程序

java - 如何动态加载Spring Controller

java - 如何使用 Querydsl 更新 JPA 实体?

java - 在下面的java代码中获取StackOverflowError