如何在没有问题的情况下使用JPA 2.0 @ManyToMany [英] How to use JPA 2.0 @ManyToMany without issues
问题描述
我在开发中使用 JPA 2.0
和 Spring
。我的实体类包含两个 @ManyToMany
关系。
@Entity(payment)
public class PaymentData实现Serializable
{
private Long pk;
私人收藏< PaymentItemData> paymentItem;
/ **
* minorPaymentItem
*
* /
私人收藏< MinorPayItemData> minorPaymentItem;
$ b @ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name =payitem_m_assig,
joinColumns =
@JoinColumn(name =pay_item_id,nullable = false),
inverseJoinColumns =
@JoinColumn(name =minor_pay_item_id,nullable = false))
public Collection< MinorPayItemData> getMinorPaymentItem()
{
return minorPaymentItem;
$ b $ **
* @param minorPaymentItem minorPaymentItem设置
* /
public void setMinorPaymentItem(final Collection< MinorPayItemData> value)
{
this.minorPaymentItem = value;
$ b @ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name =payitem_assigned,
joinColumns =
@JoinColumn(name = pay_item_id,nullable = false),
inverseJoinColumns =
@JoinColumn(name =pay_item_id,nullable = false))
public Collection< PaymentItemData> getPaymentItem()
{
return paymentItem;
$ b $ **
*设置属性paymentItem
*
* @param value -paymentItem
*
* /
public void setPaymentItem(final Collection< PaymentItemData> value)
{
this.paymentItem = value;
}
}
当我运行查询来检索记录来自数据库中的支付表,如
查询q = manager.createQuery(从支付数据a中选择一个);
q.getResultList();
如果我允许 fetch = FetchType.EAGER
@ManyToMany
,我收到以下错误:
:org.hibernate.loader.MultipleBagFetchException:无法同时在org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:94)
处获取多个购物袋
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.hib在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)LT
。在org.hibernate.impl.SessionFactoryImpl&;初始化>(SessionFactoryImpl.java:348)
。在org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1845)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
... 39 more
但是,如果我删除 fetch = FetchType.EAGER
并将其保留为 @ManyToMany ,我将会有例外情况
org.hibernate.LazyInitializationException:未能延迟初始化角色:com.data.PaymentData.paymentItem,没有会话或会话在org.h关闭
¶收藏文章登录我的社区来说两句吧...表情删除后不可恢复,是否删除取消确定图片正在上传,请稍后...正在操作中...正在操作中... ...正在操作中...正在操作中... ...正在操作中...正在操作中... AbstractPersistentCollection.java:368)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:506)
在java.lang.String.valueOf(String.java:2826)$ b $在java.lang.StringBuilder.append(StringBuilder.java:115)
在com.niu.util.Util.toString (Util.java:131)
at com.niu.util.data.BaseData.toString(BaseData.java:107)
at java.lang.String.valueOf(String.java:2826)$ b java.lang.StringBuilder.append(StringBuilder.java:115)
java.util.AbstractCollection.toString(Ab (java.lang.String.valueOf(String.java:2826)
at java.io.PrintStream.println(PrintStream.java:771)
at org .apache.tomcat.util.log.SystemLogHandler.println(SystemLogHandler.java:269)
at sun.reflect.GeneratedMethodAccessor1861.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl。 java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
在com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
在com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
在com.opensymphony.xwork2.interceptor .DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(Method (DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony .xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation .invoke(DefaultActionInvocation.java:248)
在com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
在com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterIntercepto r.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com .opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation .invoke(DefaultActionInvocation.java:248)
at com.niu.web.common.interceptor.ApplicationModelDrivenInterceptor.intercept(ApplicationModelDrivenInterceptor.java:31)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation .java:248)
在com.open symphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
处org.apache.struts2.interceptor com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
。 ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
在com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
在org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept( DebuggingInterceptor.java:270)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
at com .opensymphony.xwork 2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.I18nInterceptor。截取(I18nInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java: )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
在com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
at com.opensymphony.xwork2 .DefaultActionInvocation.invoke(DefaultAc tionInvocation.java:248)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter。
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:164)
在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java :563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
。在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:204)
在org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:311)$ b $在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)$ b $在java.lang.Thread.run(Thread.java:662)
我做错了什么
解决方案为避免
MultipleBagFetchException
,而不是使用FetchType.EAGER
,请尝试使用@LazyCollection(LazyCollectionOption.FALSE)
如下例所示:@ ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name =payitem_m_assig,joinColumns = @JoinColumn(name =pay_item_id,nullable = e),inverseJoinColumns = @JoinColumn(name =minor_pay_item_id ,nullable = false))
public Collection< MinorPayItemData> getMinorPaymentItem()
{
return minorPaymentItem;
}
以下是 docs :
<@> @LazyCollection:定义@ManyToMany和
@OneToMany关联的懒惰选项。 LazyCollectionOption可以是TRUE(
集合是懒惰的,当它的状态被访问时会被加载),
EXTRA(集合是懒惰的,所有的操作都会尝试避免
集合的加载,这个对于大型集合
特别有用,当加载所有元素时是不必要的)和FALSE(关联
不懒惰)
@Fetch:定义了用于加载关联的抓取策略。
FetchMode可以是SELECT(当需要加载关联
时触发选择),SUBSELECT(仅适用于集合,使用
子选择策略 - 请参考Hibernate Reference
文档以获取更多信息)或JOIN(使用SQL JOIN在加载所有者实体时加载
关联)。 JOIN覆盖任何
lazy属性(通过JOIN策略加载的关联不能
懒惰)。
我希望它有帮助
I am using
JPA 2.0
andSpring
in my development. My entity class contains two@ManyToMany
relationships.@Entity("payment") public class PaymentData implements Serializable { private Long pk; private Collection<PaymentItemData> paymentItem; /** * minorPaymentItem * */ private Collection<MinorPayItemData> minorPaymentItem; @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name = "payitem_m_assig", joinColumns = @JoinColumn(name = "pay_item_id", nullable = false), inverseJoinColumns = @JoinColumn(name = "minor_pay_item_id", nullable = false)) public Collection<MinorPayItemData> getMinorPaymentItem() { return minorPaymentItem; } /** * @param minorPaymentItem the minorPaymentItem to set */ public void setMinorPaymentItem(final Collection<MinorPayItemData> value) { this.minorPaymentItem = value; } @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name = "payitem_assigned", joinColumns = @JoinColumn(name = "pay_item_id", nullable = false), inverseJoinColumns = @JoinColumn(name = "pay_item_id", nullable = false)) public Collection<PaymentItemData> getPaymentItem() { return paymentItem; } /** * Set the property paymentItem * * @param value -paymentItem * */ public void setPaymentItem(final Collection<PaymentItemData> value) { this.paymentItem = value; } }
When i run a query to retrieve records from the payment table in the database, like
Query q = manager.createQuery("select a from PaymentData a"); q.getResultList();
If i allow the
fetch=FetchType.EAGER
on the@ManyToMany
, I get the following errorsCaused 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:906) ... 39 more
But if i remove
fetch=FetchType.EAGER
and leave it as@ManyToMany
, i will have the exceptionorg.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.data.PaymentData.paymentItem, 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.initialize(AbstractPersistentCollection.java:368) at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111) at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:506) at java.lang.String.valueOf(String.java:2826) at java.lang.StringBuilder.append(StringBuilder.java:115) at com.niu.util.Util.toString(Util.java:131) at com.niu.util.data.BaseData.toString(BaseData.java:107) at java.lang.String.valueOf(String.java:2826) at java.lang.StringBuilder.append(StringBuilder.java:115) at java.util.AbstractCollection.toString(AbstractCollection.java:422) at java.lang.String.valueOf(String.java:2826) at java.io.PrintStream.println(PrintStream.java:771) at org.apache.tomcat.util.log.SystemLogHandler.println(SystemLogHandler.java:269) at sun.reflect.GeneratedMethodAccessor1861.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452) at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.niu.web.common.interceptor.ApplicationModelDrivenInterceptor.intercept(ApplicationModelDrivenInterceptor.java:31) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)
What am i doing wrong
解决方案To avoid the
MultipleBagFetchException
, instead of usingFetchType.EAGER
, try using the@LazyCollection(LazyCollectionOption.FALSE)
as in this example:@ManyToMany @LazyCollection(LazyCollectionOption.FALSE) @JoinTable(name = "payitem_m_assig", joinColumns = @JoinColumn(name = "pay_item_id", nullable = e), inverseJoinColumns = @JoinColumn(name = "minor_pay_item_id", nullable = false)) public Collection<MinorPayItemData> getMinorPaymentItem() { return minorPaymentItem; }
Here is a small description of from the docs:
@LazyCollection: defines the lazyness option on @ManyToMany and @OneToMany associations. LazyCollectionOption can be TRUE (the collection is lazy and will be loaded when its state is accessed), EXTRA (the collection is lazy and all operations will try to avoid the collection loading, this is especially useful for huge collections when loading all the elements is not necessary) and FALSE (association not lazy)
@Fetch: defines the fetching strategy used to load the association. FetchMode can be SELECT (a select is triggered when the association needs to be loaded), SUBSELECT (only available for collections, use a subselect strategy - please refers to the Hibernate Reference Documentation for more information) or JOIN (use a SQL JOIN to load the association while loading the owner entity). JOIN overrides any lazy attribute (an association loaded through a JOIN strategy cannot be lazy).
I hope it helps
这篇关于如何在没有问题的情况下使用JPA 2.0 @ManyToMany的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文