Spring JPA中关系的动态获取
Posted
技术标签:
【中文标题】Spring JPA中关系的动态获取【英文标题】:Dynamic fetching for relations in Spring JPA 【发布时间】:2019-11-16 01:45:01 【问题描述】:我希望能够根据调用的 RestService 动态加载我的实体的关系。
实体类:
@Entity
public class Order
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
private Buyer buyer;
// some more attributes
@Entity
public class Buyer
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
// some more attributes
RestController 类:
@GetMapping
public Iterable<Order> getAll()
// here I want JPA to NOT load the buyers for the order
return orderRepository.findAll();
@GetMapping("/id")
public Order get(@PathVariable("id") String id)
// here I want JPA to load the buyers for the order
return orderRepository.findById(Long.parseLong(id)).orElseThrow();
就我的理解和尝试而言,LAZY
和 EAGER
或 json 注释(如 @JsonIgnore
、@JsonIdentityInfo
、@JsonManagedReference
和 @JsonBackReference
)似乎都无法实现这一点。
如果这是不可能的,也许有人可以解释如何解决这个问题。一方面,我有时需要前端中的这些关系来显示一些值,另一方面,当我总是加载它们时,我会遇到巨大的性能问题或无限递归。
【问题讨论】:
您可能正在寻找@EntityGraph
。
谢谢!!这正是我正在寻找的:)
【参考方案1】:
我不认为 JPA 直接支持您的用例。
一种选择是两次创建相同的实体 - 一次使用渴望,另一次使用惰性。在方法中切换它们。
另一种选择是使用 DTO(数据传输对象)作为响应,而不是实体类本身。不过,您必须编写映射器逻辑才能将实体转换为 DTO。
【讨论】:
@EntityGraph 确实有办法做到这一点。以上是关于Spring JPA中关系的动态获取的主要内容,如果未能解决你的问题,请参考以下文章