Java 从EJB引发的LazyInitializationException异常
我创建了一个公开为web服务(REST)的EJB。然而,当我尝试它时,我得到了下面的异常。我追溯到我在问题实体上的JPA注释。当我取消注释Java 从EJB引发的LazyInitializationException异常,java,jakarta-ee,Java,Jakarta Ee,我创建了一个公开为web服务(REST)的EJB。然而,当我尝试它时,我得到了下面的异常。我追溯到我在问题实体上的JPA注释。当我取消注释@ManyToOne映射(具有fetch属性的映射)时,它似乎抛出了这个异常。我有意将实体与其他实体之间的所有关系设置为FetchType.LAZY。我想保持这种状态 我使用的是容器管理的事务和所有正常的EJB。为什么会发生这种情况?修复方法是什么 编辑: 我有一个用@Stateless注释的存储库类,然后我在另一个EJB中使用这个类,它从存储库中检索问题列表
@ManyToOne
映射(具有fetch属性的映射)时,它似乎抛出了这个异常。我有意将实体与其他实体之间的所有关系设置为FetchType.LAZY
。我想保持这种状态
我使用的是容器管理的事务和所有正常的EJB。为什么会发生这种情况?修复方法是什么
编辑:
我有一个用@Stateless
注释的存储库类,然后我在另一个EJB中使用这个类,它从存储库中检索问题列表。最后,我有了一个资源,它也被注释为@Stateless
。是因为某种持久性上下文还是什么
PS我省略了实体中的所有其他内容,当我按照所述修复注释时,代码会起作用。
@Entity
public class Question extends AbstractModel {
private int id;
private Participant participant;
private List<Answer> answers;
private List<QuestionCategory> categories;
private List<QuestionFeedback> feedback;
public Question() {
answers = new ArrayList<Answer>();
categories = new ArrayList<QuestionCategory>();
feedback = new ArrayList<QuestionFeedback>();
}
@ManyToOne
//@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ParticipantId")
public Participant getParticipant() {
return participant;
}
//@OneToMany(cascade = CascadeType.ALL)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "QuestionId", nullable = false)
public List<Answer> getAnswers() {
return answers;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "QuestionQuestionCategory",
joinColumns = @JoinColumn(name = "QuestionId", nullable = false),
inverseJoinColumns = @JoinColumn(name = "QuestionCategoryId", nullable = false)
)
public List<QuestionCategory> getCategories() {
return categories;
}
//@OneToMany(cascade = CascadeType.ALL)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "QuestionId", nullable = false)
public List<QuestionFeedback> getFeedback() {
return feedback;
}
}
@实体
公共类问题扩展抽象模型{
私有int-id;
私人参与者;
私人名单答案;
私人名单类别;
私人名单反馈;
公众问题({
answers=newarraylist();
categories=newarraylist();
反馈=新的ArrayList();
}
@许多酮
//@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“ParticipantId”)
公共参与者getParticipant(){
返回参与者;
}
//@OneToMany(级联=级联类型.ALL)
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“QuestionId”,null=false)
公共列表getAnswers(){
返回答案;
}
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=“QuestionQuestionCategory”,
joinColumns=@JoinColumn(name=“QuestionId”,nullable=false),
inverseJoinColumns=@JoinColumn(name=“QuestionCategoryId”,null=false)
)
公共列表getCategories(){
退货类别;
}
//@OneToMany(级联=级联类型.ALL)
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“QuestionId”,null=false)
公共列表getFeedback(){
反馈;
}
}
引发此异常:
[#| 2012-11-11T00:10:59.182+0100 | WARNING | glassfish3.1.2 | javax.enterprise.system.container.web.com.sun.enterprise.web | u ThreadID=71;| u ThreadName=Thread-8;| StandardWrapperValve[javax.ws.rs.core.Application]:
PWC1406:Servlet javax.ws.rs.core.Application的Servlet.service()
引发异常org.hibernate.LazyInitializationException:无法
初始化代理-此时没有会话
org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)
在
org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:272)
在
org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at sun.reflect.GeneratedMethodAccessor76.invoke(未知源)at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.lang.reflect.Method.invoke(Method.java:601)
com.sun.xml.bind.v2.runtime.reflect.Accessor$GetterSetterReflection.get(Accessor.java:354)
在
com.sun.xml.bind.v2.runtime.reflect.Accessor.getUnadapted(Accessor.java:147)
在
com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.hasValue(TransducedAccessor.java:251)
在
com.sun.xml.bind.v2.runtime.property.SingleElementLeapProperty.serializeBody(SingleElementLeapProperty.java:105)
在
com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358)
在
com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:350)
在
com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
在
com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158)
在
com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358)
在
com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
在
com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69)
在
com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172)
在
com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159)
在
com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358)
在
com.sun.xml.bind.v2.runtime.XMLSerializer.ChildAssociatent(XMLSerializer.java:593)
在
com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:340)
在
com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)
在
com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)
在
com.sun.xml.bind.v2.runtime.MarshallerImpl.marshall(MarshallerImpl.java:178)
在
com.sun.jersey.json.impl.BaseJSONMarshaller.marshallToJSON(BaseJSONMarshaller.java:103)
在
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider.writeTo(JSONRootElementProvider.java:143)
在
com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:157)
在
com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
在
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1437)
在
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
在
com.sun.jersey.server.impl.application.WebApplicationImpl.HandlerRequest(WebApplicationImpl。
@ManyToOne
//@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ParticipantId")
public Participant getParticipant() {
return participant;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "QuestionQuestionCategory",
joinColumns = @JoinColumn(name = "QuestionId", nullable = false),
inverseJoinColumns = @JoinColumn(name = "QuestionCategoryId", nullable = false)
)
public List<QuestionCategory> getCategories() {
Hibernate.initialize(categories)
return categories;
}
public Question find(Object id) {
Question question = getEntityManager().find(Question.class, id);
Hibernate.initialize(question.getCategories());
Hibernate.initialize(question.getAnswers());
Hibernate.initialize(question.getFeedback());
return question ;
}
public void userHasClickedAQuestion(Object id) {
selectedQuestion = questionFacade.find(id);
}