如何获取@OneToMany和@ManyToMany实体 [英] How to Fetch @OneToMany and @ManyToMany Entities

查看:145
本文介绍了如何获取@OneToMany和@ManyToMany实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题与以下内容非常相关:

为什么当数据显示正确时,在这个Spring MVC Web应用程序中获取Hibernate LazyInitializationException?



对于一个特定的实体我有以下属性:

  @OneToMany(fetch = FetchType.EAGER,cascade = {CascadeType.REMOVE })
@JoinColumn(referencedColumnName =id,name =ID_FORMAT_FILE)
private List< ColumnFormat> columnList;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name =FILEFORMAT_ORIGINATOR,joinColumns = @JoinColumn(name =FILEFORMAT_ID,referencedColumnName =id)
,inverseJoinColumns = @JoinColumn(name =ORIGINATOR_ID,referencedColumnName =id))
private List< Originator>发起人;

正如你可能已经注意到我在两个关系上都有一个Eager Fetch类型,但它给出了以下内容:

 引起:org.hibernate.loader.MultipleBagFetchException:无法同时在org.hibernate中获取多个包
。 loader.BasicLoader.postInstantiate(BasicLoader.java:94)
位于org.hibernate.loader.entity.EntityLoader。< init>(EntityLoader.java:119)
位于org.hibernate.loader.entity .EntityLoader。< init>(EntityLoader.java:71)
at org.hibernate.loader.entity.EntityLoader。< init>(EntityLoader.java:54)
at org.hibernate.loader .entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:133)
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1914)
at org.hibernate.persister.entity.AbstractEntityPersister .createEntityLoader(AbstractEntityPersister.java:1937)
在org.hibernat在org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3191)
在org.hibernate.persister。
在org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3191)
在org.hibernate.persister。 entity.SingleTableEntityPersister.postInstantiate(SingleTableEntityPersister.java:728)
at org.hibernate.impl.SessionFactoryImpl。< init>(SessionFactoryImpl.java:348)
at org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1845)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:902)
... 33 more

我必须访问这两个列表 List< ColumnFormat> columnList List< Originator>如果两者都是获取类型 Eager ,我会得到上述问题,如果其中一个是 Lazy

我得到以下内容:

 原因:org.hibernate.LazyInitializationException:未能懒惰地初始化一个角色集合:xxx.xxx.xxx.xxx.FileFormat.originators,没有会话或会话被关闭
在org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
在org.hibernate.collection .AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollection.readElementExistence(AbstractPersistentCollection.java:157)
at org.hibernate.collection.PersistentBag.contains(PersistentBag.java :262)
在java.util.ArrayList.batchRemove(ArrayList.java:632)
在java.util.ArrayList.removeAll(Array List.java:605)
at xxx.xxx.xxx.xxx.bean.FileFormatEdit.init(FileFormatEdit.java:1040)
... 75 more


有没有办法在不存在这些问题的情况下检索不同bean的列表?

解决方案

之前没有遇到过这个问题,但是只是使用谷歌搜索不能同时获取多个包返回这个链接在Hibernate论坛上。



其中的 blog posts


my issue is very related to the following:
Why am I getting a Hibernate LazyInitializationException in this Spring MVC web application when the data displays correctly?

I have the following properties on a particular entity:

@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.REMOVE})
@JoinColumn(referencedColumnName = "id", name = "ID_FORMAT_FILE")
private List<ColumnFormat> columnList;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "FILEFORMAT_ORIGINATOR", joinColumns = @JoinColumn(name =   "FILEFORMAT_ID", referencedColumnName = "id")
    , inverseJoinColumns = @JoinColumn(name = "ORIGINATOR_ID", referencedColumnName = "id"))
private List<Originator> originators;  

As you might have noticed I have an Eager Fetch type on both relations, but it is giving the following:

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
    at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:94)
    at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:119)
    at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:71)
    at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:54)
    at org.hibernate.loader.entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:133)
    at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1914)
    at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1937)
    at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3205)
    at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3191)
    at org.hibernate.persister.entity.SingleTableEntityPersister.postInstantiate(SingleTableEntityPersister.java:728)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:902)
    ... 33 more  

I must access both lists List<ColumnFormat> columnList and List<Originator> originators on different beans, but if both are of Fetch Type Eager I get the above problem, and if one of them is Lazy I get the following:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: xxx.xxx.xxx.xxx.FileFormat.originators, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
    at org.hibernate.collection.AbstractPersistentCollection.readElementExistence(AbstractPersistentCollection.java:157)
    at org.hibernate.collection.PersistentBag.contains(PersistentBag.java:262)
    at java.util.ArrayList.batchRemove(ArrayList.java:632)
    at java.util.ArrayList.removeAll(ArrayList.java:605)
    at xxx.xxx.xxx.xxx.bean.FileFormatEdit.init(FileFormatEdit.java:1040)
    ... 75 more  

Is there a way to retrieve the lists on the different beans without having these problems?

解决方案

Haven't encountered this problem before, but just googling "cannot simultaneously fetch multiple bags" returns this link on the Hibernate forums.

One of the blog posts in that link may contain the solution you're looking for.

这篇关于如何获取@OneToMany和@ManyToMany实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆