gpt4 book ai didi

java - hibernate/jpa 忽略@XxxToOne 关系中的 LAZY FETCHING

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:21 24 4
gpt4 key购买 nike

我正在使用 hibernate 5 作为 JPA 实现,但我遇到了 @OneToMany 双向关系的问题。

这些是我的实体:

@Entity(name = "product_item")
public class ProductItem {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "receptacle")
private Receptacle receptacle;

...

}

@Entity(name = "receptacle")
public class Receptacle {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "receptacle", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<ProductItem> productItems = new HashSet<>();

...

}

我希望这种关系在两个方向上都是惰性的,因为我想像下面的查询一样通过 FETCH JOIN 手动获取数据:

String query = "SELECT " 
+ " DISTINCT r"
+ " FROM"
+ " receptacle r"
+ " JOIN FETCH product_item pi ON r.id = pi.receptacle.id"
+ " JOIN ereturn er ON er.id = pi.ereturn.id"
+ " WHERE"
+ " r.masterCrossDock IS NULL";

但我的问题是 hibernate 忽略了 @ManyToOne(fetch = FetchType.LAZY) 因此 Jackson 由于通过引用链的无限递归 (StackOverflowError) 而中断,如下所示:

org.glassfish.jersey.server.internal.process.MappableException: com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: returnitRest.Receptacle["productItems"]->org.hibernate.collection.internal.PersistentSet[0]->returnitRest.ProductItem["receptacle"]->returnitRest.Receptacle["productItems"]->org.hibernate.collection.internal.PersistentSet[0]->returnitRest.ProductItem["receptacle"]- ...

问题 1:我怎么能告诉 Hibernate 不要获取 @ManyToOne 关系方向?

问题 2:如果我尝试做的事情不可能,为什么?

问题 3:做我想做的事情的最佳方式是什么?

非常感谢

最佳答案

根据 JPA 规范,LAZY 加载是提供者可以完全忽略的提示,完全取决于提供者(此处 hibernate )是考虑还是忽略它(还考虑到单值关联 -OneToOne 和 ManyToOne - 默认情况下急切加载)。...所以你不能依赖它。

关于递归问题,查看my post在这里,我遇到了与 gson 类似的问题,这就是我解决它的方法

关于java - hibernate/jpa 忽略@XxxToOne 关系中的 LAZY FETCHING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49397936/

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