Hibernate @manytomy上的LazyInitializationException,尽管FetchType=EAGER
由于我仍然面临着这个问题,在梳理了这个流行例外的所有解决方案之后,我的情况如下。在我的案例(汽车池)中,我有以下两种车型:Hibernate @manytomy上的LazyInitializationException,尽管FetchType=EAGER,hibernate,jpa,many-to-many,jsf-2.2,Hibernate,Jpa,Many To Many,Jsf 2.2,由于我仍然面临着这个问题,在梳理了这个流行例外的所有解决方案之后,我的情况如下。在我的案例(汽车池)中,我有以下两种车型: @Entity public abstract class Car { @GeneratedValue @Id private Long id; private String name; @ManyToMany (cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) @Join
@Entity
public abstract class Car {
@GeneratedValue @Id
private Long id;
private String name;
@ManyToMany (cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinTable (name = "Car_Person", joinColumns=@JoinColumn(name = "CarId", referencedColumnName = "id"),
inverseJoinColumns=@JoinColumn(name = "personId", referencedColumnName = "id"))
private List<Person> carUsers;
//rest omitted
}
任何帮助都将不胜感激。根据您的配置,您应该在
web.xml
中作为过滤器尝试此操作,以便延迟加载属性
Hibernate(请注意spring和Hibernate版本使用正确版本的org.springframework.orm.Hibernate{***您的***版本***}
):
冬眠过滤器
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
sessionFactoryBeanName
会话工厂
冬眠过滤器
/*
Jpa:
oemInViewFilter
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
EntityManager工厂名称
实体管理工厂
oemInViewFilter
/*
好的,我找到了答案。感谢伟大的巴卢斯
这个问题不仅与多对多关系有关,这就是为什么急切抓取没有帮助,甚至反模式也没有帮助(hibernate.enable\u lazy\u load\u no\u trans,视图中的opensession)
问题的真正原因是SelectManyMenu。你必须告诉它,它应该处理什么样的结果集。在我的例子中,我必须像这样添加collectionType:
<p:selectManyMenu value="#{carController.currentCar.carUsers}" converter="personConverter">
<f:selectItems value="#{personBean.persons}" var="person" itemLabel="#{person.name}" itemValue="#{person}"/>
</p:selectManyMenu>
<p:selectManyMenu value="#carController.currentCar.motUsers}" collectionType="java.util.LinkedHashSet">
首先尝试将motUsers
更改为carUsers
我看到一个错误的映射,指向Person类。很抱歉,我调整了类名以使代码更简洁。请注意使用“急切”对许多关系。阅读原因:可能最好保持懒惰并使用Hibernate.initialize或使用EntityGraphHanks Simon初始化集合,我知道不太推荐使用EAGER。你能告诉我如何以及在哪里放置Hibernate.initialize
?谢谢Moodi,但是我得到了一个ClassNotFoundException:org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
我在使用Wildfly,不使用spring。是的,我使用的是Maven。如果我使用JPA,你的确切意思是什么?Wildfly会自动使用Hibernate作为JPA提供者。感谢您将url添加到“其他地方的答案”中。您可以编辑您的答案并在那里添加相关内容
11:02:27,769 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (default task-42) org.hibernate.LazyInitializationException: failed to lazily initialize a collection, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:204)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:148)
at org.hibernate.collection.internal.PersistentBag.isEmpty(PersistentBag.java:266)
at javax.faces.component.UIInput.isEmpty(UIInput.java:1272)
at javax.faces.component.UIInput.validateValue(UIInput.java:1159)
at javax.faces.component.UISelectMany.validateValue(UISelectMany.java:579)
at javax.faces.component.UIInput.validate(UIInput.java:982)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1248)
at javax.faces.component.UIInput.processValidators(UIInput.java:712)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
at org.primefaces.component.dialog.Dialog.processValidators(Dialog.java:423)
at javax.faces.component.UIForm.processValidators(UIForm.java:253)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1195)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
<filter>
<filter-name>oemInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>entityManagerFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>oemInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
<p:selectManyMenu value="#carController.currentCar.motUsers}" collectionType="java.util.LinkedHashSet">