我正在使用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:无限 递归(StackOverflowError)(通过引用链: returnitRest.Receptacle [ “productItems”] - &GT; org.hibernate.collection.internal.PersistentSet [0] - &GT; returnitRest.ProductItem [ “插座”] - &GT; returnitRest.Receptacle [ “productItems”] - &GT;有机hibernate.collection.internal.PersistentSet [0] - &GT; returnitRest.ProductItem [ “插座”] - ...
问题1: 我怎么能告诉hibernate不要获取@ManyToOne关系方向?
问题2: 如果我想做的不可能,为什么?
问题3: 做我想做的最好的方法是什么?
非常感谢
答案 0 :(得分:0)
根据JPA规范,LAZY加载是提示者可以完全忽略的暗示,完全由提供者(hibernate在这里)来考虑或忽略它(也给出单值关联-OneToOne和ManyToOne - 默认情况下急切加载....所以你不能依赖它。
关于递归问题,请在这里查看my post,我和gson有类似的问题,这就是我解决它的方法