我在一堆实体上有一对多的关系。但是,我并不总是希望为孩子们定义一个值。因为它可以是一对多,所以它可以为空。
当我不创建子对象时,我的测试因参照完整性约束违规而失败。
我尝试在连接中添加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
答案 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的注释,您的应用程序将不再没有供应商依赖性