0

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

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

我尝试将 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
4

1 回答 1

1

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

当渴望获取多个列表时,会引发多个包异常。您可以通过两种方式解决此问题:

用一组替换列表。允许急切地获取任意数量的 Set。

@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)您可以通过指定集合并指定子选择或连接来大大提高性能。请注意,这是一个特定于休眠的注释,您的应用程序将不再依赖供应商

于 2013-03-27T16:44:00.897 回答