Как получить сущности @OneToMany и @ManyToMany

моя проблема очень связана со следующим:
Почему я получаю Hibernate LazyInitializationException в этом веб-приложении Spring MVC, когда данные отображаются правильно?

У меня есть следующие свойства для конкретного объекта:

@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;  

Как вы могли заметить, у меня есть тип Eager Fetch для обоих отношений, но он дает следующее:

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  

Я должен получить доступ к обоим спискам List<ColumnFormat> columnList и List<Originator> originators в разных bean-компонентах, но если оба имеют тип извлечения Eager, я получаю указанную выше проблему, и если один из них Lazy Я получаю следующее:

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  

Есть ли способ получить списки на разных компонентах без этих проблем?


person camiloqp    schedule 31.03.2011    source источник
comment
не могли бы вы опубликовать некоторые коды, которые вы используете для получения данных?   -  person Nathanphan    schedule 01.04.2011
comment
Ответ можно найти здесь: Hibernate не может одновременно получать несколько пакетов   -  person chepseskaf    schedule 12.09.2012


Ответы (2)


Раньше с этой проблемой не сталкивался, но просто погуглив «невозможно одновременно получить несколько сумок», вы получите эту ссылку. на форумах Hibernate.

Одна из сообщений в блоге по этой ссылке может содержать решение, которое вы ищешь.

person masotime    schedule 31.03.2011
comment
Ссылки, которые вы дали, безусловно, помогли. Спасибо, все еще работаю над решением - person camiloqp; 01.04.2011
comment
Я приму ваш ответ, потому что он решает реальный вопрос, который я поставил, однако, учитывая новое требование, мне пришлось решать его по-другому. - person camiloqp; 01.04.2011

Я удалил все fetch=FetchType.EAGER, и все работает правильно. Я использую Hibernate 3.5.6-Final, Spring 3.0.4 и Junit 4. Я думаю, что fetch-EAGER по умолчанию, потому что мой объект загружает всех дочерних элементов.

Это сессионная фабрика:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    p:dataSource-ref="dataSource"
    p:packagesToScan="org.pfc.modelo">

    <property name="hibernateProperties">
        <props>
            <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="show_sql">true</prop>
            <prop key="format_sql">true</prop>
        </props>
    </property>
</bean>

Это класс:

@Entity
@Table(name="D_ACTIVIDAD")
public class Actividad implements Serializable {


private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(sequenceName="SQ_ACTIVIDAD",name="seqActividad")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seqActividad")
private Integer idActividad;

@Column(name="FECHA",nullable=false)
@Temporal(TemporalType.TIMESTAMP)
private Calendar fecha;

@Column(name="TITULO",nullable=false)
private String titulo;

@Column(name="TEXTO",nullable=false)
private String texto;

@ManyToOne
@JoinColumn(name="IDASOCIACION")
private Asociacion asociacion;

@OneToMany(mappedBy="actividad",cascade=CascadeType.ALL,orphanRemoval=true)
private List<ComentarioActividad> comentarios;

@OneToMany(mappedBy="actividad",cascade=CascadeType.ALL,orphanRemoval=true)
@OrderBy(value="fecha")
private List<Documento> documentos;

     //set and get methods 
     ...........
     ...........
     ...........

   }
person Rafael Ruiz Tabares    schedule 24.01.2012