为一对多hibernate jpa设置值



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

未创建子对象时,我的测试因违反引用完整性约束而失败。

我尝试添加可空的true到连接,但似乎没有解决这个问题。

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

我尝试使用fetch类型的热切,得到一个不同的错误。

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

抛出:

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

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

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

将list替换为set。任意数量的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)并指定子选择或连接来极大地提高性能。注意,这是一个特定于hibernate的注释,您的应用程序将不再不依赖于供应商

最新更新