java 如何获取@OneToMany 和@ManyToMany 实体
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5507077/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to Fetch @OneToMany and @ManyToMany Entities
提问by camiloqp
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?
我的问题与以下问题非常相关:
当数据正确显示时,为什么在这个 Spring MVC Web 应用程序中出现 Hibernate LazyInitializationException?
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:
您可能已经注意到,我在两个关系上都有一个 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
I must access both lists List<ColumnFormat> columnList
and List<Originator> originators
on different beans, but if both are of Fetch TypeEagerI get the above problem, and if one of them is LazyI get the following:
我必须访问两个列表List<ColumnFormat> columnList
和List<Originator> originators
不同的 bean,但是如果两者都是Fetch Type 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
Is there a way to retrieve the lists on the different beans without having these problems?
有没有办法在没有这些问题的情况下检索不同 bean 上的列表?
采纳答案by masotime
Haven't encountered this problem before, but just googling "cannot simultaneously fetch multiple bags" returns this linkon the Hibernate forums.
以前没有遇到过这个问题,但只是在 Hibernate 论坛上搜索“无法同时获取多个包”会返回此链接。
One of the blog postsin that link may contain the solution you're looking for.
该链接中的一篇博文可能包含您正在寻找的解决方案。
回答by Rafael Ruiz Tabares
I deleted all fetch=FetchType.EAGER
and it work correct. I′m usign Hibernate 3.5.6-Final, Spring 3.0.4 and Junit 4. I think fetch-EAGER is by default, because my object loads all children.
我删除了所有fetch=FetchType.EAGER
,它工作正常。我使用 Hibernate 3.5.6-Final、Spring 3.0.4 和 Junit 4。我认为 fetch-EAGER 是默认的,因为我的对象加载所有孩子。
This is sessionFactory:
这是会话工厂:
<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>
This is class:
这是类:
@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
...........
...........
...........
}