hibernate / jpa在@XxxToOne关系中忽略了LAZY FETCHING

时间:2018-03-21 03:58:09

标签: 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)
    @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: 做我想做的最好的方法是什么?

非常感谢

1 个答案:

答案 0 :(得分:0)

根据JPA规范,LAZY加载是提示者可以完全忽略的暗示,完全由提供者(hibernate在这里)来考虑或忽略它(也给出单值关联-OneToOne和ManyToOne - 默认情况下急切加载....所以你不能依赖它。

关于递归问题,请在这里查看my post,我和gson有类似的问题,这就是我解决它的方法