设置一到多个休眠jpa的值

时间:2013-03-27 12:52:56

标签: hibernate jpa

我在一堆实体上有一对多的关系。但是,我并不总是希望为孩子们定义一个值。因为它可以是一对多,所以它可以为空。

当我不创建子对象时,我的测试因参照完整性约束违规而失败。

我尝试在连接中添加nullable true但是似乎没有解决问题。

@JoinColumn(name = "image_relation")
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany
private List<Image> productImageGroup;

我尝试使用fetch类型的eager并得到了不同的错误。

@JoinColumn(name = "product_item_relation")
@OneToMany(fetch=FetchType.EAGER)
private List<ProductItems> productItemGroup;

抛出:

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

1 个答案:

答案 0 :(得分:1)

问题很可能与@LazyCollection被误用有关。

当急切地获取多个List时,会抛出多个包异常。您可以通过两种方式解决此问题:

用一组替换列表。允许任意数量的集合被提取。

@JoinColumn(name = "product_item_relation")
@OneToMany(fetch=FetchType.EAGER)
private Set<ProductItems> productItemGroup;

或删除急切的抓取并在程序代码中处理

@JoinColumn(name = "product_item_relation")
@OneToMany
private List<ProductItems> productItemGroup;

public List<MyObject> getMyObjects(){
    List<MyObject> objects = entityManager.createQuery("SELECT o FROM MyObject o").getResultList();
    // OneToMany not fetched yet
    for(MyObject o : objects)
        Hibernate.initialize(o.getProductItemGroup()); // Same as simply accessing the list to force loading, but states your intention more clearly.
    // OneToMany collection is now fetched.
    return objects;
}

通过在集合上指定@org.hibernate.annotations.Fetch(fetchMode)并指定subselect或join,可以大大提高性能。请注意,这是一个特定于hibernate的注释,您的应用程序将不再没有供应商依赖性