设置一对多hibernate jpa的值

设置一对多hibernate jpa的值,hibernate,jpa,Hibernate,Jpa,我在我的一堆实体上有一对多的关系。但是,我并不总是希望为孩子定义一个值。因为它可以是一对多,所以它可以是空的 当我不创建子对象时,我的测试失败,并违反了引用完整性约束 我尝试将nullable true添加到联接中,但这似乎并没有解决问题 @JoinColumn(name = "image_relation") @LazyCollection(LazyCollectionOption.FALSE) @OneToMany private List<Image> productImage

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

当我不创建子对象时,我的测试失败,并违反了引用完整性约束

我尝试将nullable true添加到联接中,但这似乎并没有解决问题

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

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

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

用集合替换列表。允许任意数量的集合被急切地获取

@JoinColumn(name = "product_item_relation")
@OneToMany(fetch=FetchType.EAGER)
private Set<ProductItems> productItemGroup;
@JoinColumn(name=“产品项目关系”)
@OneToMany(fetch=FetchType.EAGER)
私有集合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;
}
@JoinColumn(name=“产品项目关系”)
@独身癖
私有列表productItemGroup;
公共列表getMyObjects(){
List objects=entityManager.createQuery(“从MyObject o中选择o”).getResultList();
//一个女人还没来
对于(MyObject o:对象)
Hibernate.initialize(o.getProductItemGroup());//与简单地访问列表以强制加载相同,但更清楚地说明了您的意图。
//OneToMany收藏现在已取回。
归还物品;
}

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

这很可能与LazyCollection有关,通常没有空的onetomany关系问题。在我开始执行LazyCollection之前,我的fetch类型为,然后,当我添加第二个onetomany时,我遇到了一个太多包的问题。你看了吗?@sharakan,是的,这就是为什么我切换到Lazy,并开始获得另一个问题。我不认为添加LazyCollection是多包问题的标准解决方案。你能用一套吗?允许获取多个集合。即使在某些情况下需要列表,也可以轻松地在getter中转换为所需的任何内容。
@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;
}