gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:00:44 24 4
gpt4 key购买 nike

我最近开始了一个使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com