如何解决我遇到的 "LazyInitializationException"?
How to fix the "LazyInitializationException" I'm encountering?
希望你能帮助我停止用头撞墙。
这是我的问题,在许多论坛上进行了大量研究后,我没有找到与我遇到的问题兼容的答案。
我有 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.supinfo.suppicture.entity.User.pictures, no session or session was closed
这似乎是一个已知的异常,但仍然让我发疯...
我试过强制预加载而不是延迟加载,但仍然遇到同样的问题。
这是我的 类:
category.java
@Entity
@Table(name = "category")
@XmlRootElement
public class Category{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String Name;
@OneToMany(mappedBy = "category")
private Collection<Picture> pictures;
(getters and setters)
user.java
@Entity
@Table(name = "user")
@XmlRootElement
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String username;
private String password;
private String firstName;
private String lastName;
private String phoneNumber;
private String postalAddress;
private String email;
@OneToMany(mappedBy = "author")
private Collection<Picture> pictures;
(getters and setters)
picture.java
@Entity
@Table(name = "picture")
@XmlRootElement
public class Picture {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private String description;
@Column(columnDefinition="longblob")
private byte[] image;
private Date dateOfPublish;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "category_id")
private Category category;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User author;
(getters and setters)
这是我如何尝试在数据库中检索我的图片的示例(这是唯一一个有外键的图片)
@Override
public List<Picture> getAllPictures() {
EntityManager em = emf.createEntityManager();
try {
CriteriaQuery<Picture> criteriaQuery = em.getCriteriaBuilder()
.createQuery(Picture.class);
criteriaQuery.from(Picture.class);
return em.createQuery(criteriaQuery).getResultList();
} finally {
em.close();
}
}
最后这样调用:
@Path("/picture")
public class PictureController {
@GET
@Path("/all") @Produces(MediaType.APPLICATION_JSON)
public List<Picture> getAllPictures(){
return DaoFactory.getPictureDao().getAllPictures();
}
以下异常的完整堆栈跟踪:
热。 2019 年 3 月 4:38:48 下午 org.hibernate.LazyInitializationException
GRAVE:未能延迟初始化角色集合:com.supinfo.suppicture.entity.User.pictures,没有会话或会话已关闭
org.hibernate.LazyInitializationException:延迟初始化角色集合失败:com.supinfo.suppicture.entity.User.pictures,没有会话或会话已关闭
在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
在 org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
在 org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
在 org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)
在 com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:266)
在 com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:253)
在 com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:118)
在 com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:144)
在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345)
在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
在 com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:143)
在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345)
在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:578)
在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:326)
在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:479)
在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308)
在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:163)
在 com.sun.jersey.json.impl.provider.entity.JSONListElementProvider.writeList(JSONListElementProvider.java:145)
在 com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.writeTo(AbstractListElementProvider.java:264)
在 com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
在 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1448)
在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360)
在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350)
在 com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
在 java.lang.Thread.run(Thread.java:748)
热。 2019 年 03 月 4:38:48 下午 org.apache.catalina.core.StandardWrapperValve 调用
GRAVE: "Servlet.service()" pour la servlet jersey-servlet a généré une 异常
org.hibernate.LazyInitializationException:延迟初始化角色集合失败:com.supinfo.suppicture.entity.User.pictures,没有会话或会话已关闭
在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
在 org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
在 org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
在 org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)
在 com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:266)
在 com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:253)
在 com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:118)
在 com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:144)
在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345)
在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
在 com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:143)
在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345)
在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:578)
在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:326)
在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:479)
在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308)
在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:163)
在 com.sun.jersey.json.impl.provider.entity.JSONListElementProvider.writeList(JSONListElementProvider.java:145)
在 com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.writeTo(AbstractListElementProvider.java:264)
在 com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
在 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1448)
在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360)
在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350)
在 com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
在 java.lang.Thread.run(Thread.java:748)
您需要使用获取策略 EAGER
.
修饰 OneToMany
属性 user.pictures
和 category.pictures
class Category {
@OneToMany(mappedBy = "category", fetch = FetchType.EAGER)
Collection<Picture> pictures;
}
class User {
@OneToMany(mappedBy = "author", fetch = FetchType.EAGER)
Collection<Picture> pictures;
}
附带说明一下,您实际上不需要使用 EAGER
提取策略修饰 ManyToOne
属性,因为这被认为是 默认行为.
- 似乎没有打开会话,或者没有交易。您缺少交易的开始和结束。
- 有两种选择,要么您的经理自己处理事务,要么某个事务经理在某个容器中执行该事务。
非托管环境习语
EntityManager em = emf.createEntityManager();
实体交易 tx = null;
尝试 {
tx = em.getTransaction();
tx.begin();
// 做一些工作
...
在此处输入代码
tx.commit();
}
赶上(RuntimeException e){
如果 ( tx != null && tx.isActive() ) tx.rollback();
扔 e; // 或显示错误信息
}
最后 {
em.close();
}
- 更多信息在这里:https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html
让我们一步一步来划分
1) 你的球衣网络控制器正在调用你的 dao 方法来获取图片列表(没有错误)
2) 现在你的 dao 层正在从数据库中获取数据(没有错误)
3) 值返回到您的 Web 服务控制器方法(无错误)
4) 但您正在使用自动 json 转换器将对象数据转换为 json。您的照片具有与用户关联的数据。当 json 转换器尝试获取用户数据时,该值为空,因为您的交易已经结束,导致异常。尝试在 json 转换期间忽略类别和用户字段,如下所示。
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "category_id")
private Category category;
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User author;
5) 不要直接使用图片对象进行json转换,否则会造成循环冗余(死循环)。尝试创建另一个图片包装器 class 来处理这种情况
图片->用户->图片->用户(循环冗余)
所以为了解决这个问题,创建三个包装器 classes
public class PictureWrapper
{
private int id;
private String name;
private String description;
private byte[] image;
private Date dateOfPublish;
private CategoryWrapper category;
private UserWrapper author;
}
public class UserWrapper
{
private int id;
private String username;
private String password;
private String firstName;
private String lastName;
private String phoneNumber;
private String postalAddress;
private String email;
}
public class CategoryWrapper
{
private int id;
private String Name;
}
然后将 getAllPictures 方法更改为以下
public List<PictureWrapper> getAllPictures()
{
List<PictureWrapper> resultList = new ArrayList<PictureWrapper>();
EntityManager em = emf.createEntityManager();
try
{
CriteriaQuery<Picture> criteriaQuery = em.getCriteriaBuilder().createQuery(Picture.class);
criteriaQuery.from(Picture.class);
List<Picture> list = em.createQuery(criteriaQuery).getResultList();
if(list != null && list.size() != 0)
{
for(Picture picture : list)
{
PictureWrapper pictureWrapper = new PictureWrapper();
//Load data from picture to picture wrapper with user and category
resultList.add(pictureWrapper);
}
}
}
finally
{
em.close();
}
return resultList;
}
希望你能帮助我停止用头撞墙。
这是我的问题,在许多论坛上进行了大量研究后,我没有找到与我遇到的问题兼容的答案。
我有 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.supinfo.suppicture.entity.User.pictures, no session or session was closed
这似乎是一个已知的异常,但仍然让我发疯...
我试过强制预加载而不是延迟加载,但仍然遇到同样的问题。
这是我的 类:
category.java
@Entity
@Table(name = "category")
@XmlRootElement
public class Category{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String Name;
@OneToMany(mappedBy = "category")
private Collection<Picture> pictures;
(getters and setters)
user.java
@Entity
@Table(name = "user")
@XmlRootElement
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String username;
private String password;
private String firstName;
private String lastName;
private String phoneNumber;
private String postalAddress;
private String email;
@OneToMany(mappedBy = "author")
private Collection<Picture> pictures;
(getters and setters)
picture.java
@Entity
@Table(name = "picture")
@XmlRootElement
public class Picture {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private String description;
@Column(columnDefinition="longblob")
private byte[] image;
private Date dateOfPublish;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "category_id")
private Category category;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User author;
(getters and setters)
这是我如何尝试在数据库中检索我的图片的示例(这是唯一一个有外键的图片)
@Override
public List<Picture> getAllPictures() {
EntityManager em = emf.createEntityManager();
try {
CriteriaQuery<Picture> criteriaQuery = em.getCriteriaBuilder()
.createQuery(Picture.class);
criteriaQuery.from(Picture.class);
return em.createQuery(criteriaQuery).getResultList();
} finally {
em.close();
}
}
最后这样调用:
@Path("/picture")
public class PictureController {
@GET
@Path("/all") @Produces(MediaType.APPLICATION_JSON)
public List<Picture> getAllPictures(){
return DaoFactory.getPictureDao().getAllPictures();
}
以下异常的完整堆栈跟踪:
热。 2019 年 3 月 4:38:48 下午 org.hibernate.LazyInitializationException GRAVE:未能延迟初始化角色集合:com.supinfo.suppicture.entity.User.pictures,没有会话或会话已关闭 org.hibernate.LazyInitializationException:延迟初始化角色集合失败:com.supinfo.suppicture.entity.User.pictures,没有会话或会话已关闭 在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) 在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) 在 org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368) 在 org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111) 在 org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272) 在 com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:266) 在 com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:253) 在 com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:118) 在 com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:144) 在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345) 在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681) 在 com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:143) 在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345) 在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:578) 在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:326) 在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:479) 在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308) 在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:163) 在 com.sun.jersey.json.impl.provider.entity.JSONListElementProvider.writeList(JSONListElementProvider.java:145) 在 com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.writeTo(AbstractListElementProvider.java:264) 在 com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306) 在 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1448) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350) 在 com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) 在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:748)
热。 2019 年 03 月 4:38:48 下午 org.apache.catalina.core.StandardWrapperValve 调用 GRAVE: "Servlet.service()" pour la servlet jersey-servlet a généré une 异常 org.hibernate.LazyInitializationException:延迟初始化角色集合失败:com.supinfo.suppicture.entity.User.pictures,没有会话或会话已关闭 在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) 在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) 在 org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368) 在 org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111) 在 org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272) 在 com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:266) 在 com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:253) 在 com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:118) 在 com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:144) 在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345) 在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681) 在 com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:143) 在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345) 在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:578) 在 com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:326) 在 com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:479) 在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308) 在 com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:163) 在 com.sun.jersey.json.impl.provider.entity.JSONListElementProvider.writeList(JSONListElementProvider.java:145) 在 com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.writeTo(AbstractListElementProvider.java:264) 在 com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306) 在 com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1448) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360) 在 com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350) 在 com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) 在 com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:748)
您需要使用获取策略 EAGER
.
OneToMany
属性 user.pictures
和 category.pictures
class Category {
@OneToMany(mappedBy = "category", fetch = FetchType.EAGER)
Collection<Picture> pictures;
}
class User {
@OneToMany(mappedBy = "author", fetch = FetchType.EAGER)
Collection<Picture> pictures;
}
附带说明一下,您实际上不需要使用 EAGER
提取策略修饰 ManyToOne
属性,因为这被认为是 默认行为.
- 似乎没有打开会话,或者没有交易。您缺少交易的开始和结束。
- 有两种选择,要么您的经理自己处理事务,要么某个事务经理在某个容器中执行该事务。
非托管环境习语
EntityManager em = emf.createEntityManager(); 实体交易 tx = null; 尝试 { tx = em.getTransaction(); tx.begin();
// 做一些工作 ... 在此处输入代码 tx.commit(); } 赶上(RuntimeException e){ 如果 ( tx != null && tx.isActive() ) tx.rollback(); 扔 e; // 或显示错误信息 } 最后 { em.close(); }
- 更多信息在这里:https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html
让我们一步一步来划分
1) 你的球衣网络控制器正在调用你的 dao 方法来获取图片列表(没有错误)
2) 现在你的 dao 层正在从数据库中获取数据(没有错误)
3) 值返回到您的 Web 服务控制器方法(无错误)
4) 但您正在使用自动 json 转换器将对象数据转换为 json。您的照片具有与用户关联的数据。当 json 转换器尝试获取用户数据时,该值为空,因为您的交易已经结束,导致异常。尝试在 json 转换期间忽略类别和用户字段,如下所示。
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "category_id")
private Category category;
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User author;
5) 不要直接使用图片对象进行json转换,否则会造成循环冗余(死循环)。尝试创建另一个图片包装器 class 来处理这种情况
图片->用户->图片->用户(循环冗余)
所以为了解决这个问题,创建三个包装器 classes
public class PictureWrapper
{
private int id;
private String name;
private String description;
private byte[] image;
private Date dateOfPublish;
private CategoryWrapper category;
private UserWrapper author;
}
public class UserWrapper
{
private int id;
private String username;
private String password;
private String firstName;
private String lastName;
private String phoneNumber;
private String postalAddress;
private String email;
}
public class CategoryWrapper
{
private int id;
private String Name;
}
然后将 getAllPictures 方法更改为以下
public List<PictureWrapper> getAllPictures()
{
List<PictureWrapper> resultList = new ArrayList<PictureWrapper>();
EntityManager em = emf.createEntityManager();
try
{
CriteriaQuery<Picture> criteriaQuery = em.getCriteriaBuilder().createQuery(Picture.class);
criteriaQuery.from(Picture.class);
List<Picture> list = em.createQuery(criteriaQuery).getResultList();
if(list != null && list.size() != 0)
{
for(Picture picture : list)
{
PictureWrapper pictureWrapper = new PictureWrapper();
//Load data from picture to picture wrapper with user and category
resultList.add(pictureWrapper);
}
}
}
finally
{
em.close();
}
return resultList;
}