Java hibernate/jpa忽略@XxxToOne关系中的惰性抓取
我正在使用hibernate 5作为JPA实现,我对@OneToMany双向关系有一个问题 这些是我的实体:Java hibernate/jpa忽略@XxxToOne关系中的惰性抓取,java,hibernate,jpa,fetch,jpa-2.1,Java,Hibernate,Jpa,Fetch,Jpa 2.1,我正在使用hibernate 5作为JPA实现,我对@OneToMany双向关系有一个问题 这些是我的实体: @Entity(name = "product_item") public class ProductItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinCol
@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<>();
...
}
但我的问题是hibernate忽略了@ManyTone(fetch=FetchType.LAZY),因此Jackson由于引用链的无限递归(StackOverflowError)而中断,如下所示:
org.glassfish.jersey.server.internal.process.MappableException:
com.fasterxml.jackson.databind.JsonMappingException:无限
递归(StackOverflowError)(通过引用链:
returnitRest.receptor[“productItems”]->org.hibernate.collection.internal.PersistentSet[0]->returnitRest.ProductItem[“receptor”]->returnitRest.receptor[“productItems”]->org.hibernate.collection.internal.PersistentSet[0]->returnitRest.ProductItem[“receptor”]-
问题1:
我如何告诉hibernate不要获取@manytone关系方向
问题2:
如果我想做的不可能,为什么
问题3:
做我想做的事情的最好方式是什么
非常感谢
< P>根据JPA规范,懒惰加载是提供者完全可以忽略的提示,它完全由提供者(Hibernate在这里)来考虑或忽略它(也给出了单值关联- OneToOne和MytotoNo-默认加载)…所以不能依赖它。关于递归问题,请检查这里,我与gson有一个类似的问题,这就是我解决问题的方式我怀疑这个问题可能不是因为
许多人懒惰
或渴望
。你可能需要打破杰克逊的循环,我相信你可能需要将@JsonIgnore
放在as的一边社交。@Madhusudanareddysunapu为什么你认为懒散抓取对我没有帮助?一旦你指定ManyToOne为懒散,hibernate会尊重这一点,并且不会影响ManyToOne。但是,我认为正在发生的是,随后在jackson反序列化过程中,它也会尝试反序列化ManyToOne Association,除非我们告诉jackson忽略我t、 因此,它会导致在该点获取多个One,然后进入反序列化循环。我没有尝试过它,但为了排除hibernate,您可能需要手动创建ProductItem和插座对象,并手动将它们关联到一个One和多个One设置器中,然后尝试对该对象进行jackson反序列化。I cl在jackson启动之前关闭entityManager…我想知道hibernate是否知道父对象已经在缓存中,因此它会自动创建循环,因此延迟抓取意味着不去数据库获取对象,而是在缓存中构建它。这有意义吗?
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";