简体   繁体   English

org.hibernate.LazyInitializationException关联集合

[英]org.hibernate.LazyInitializationException associated collection

I have two model classes which are related by many-to-many relationships: 我有两个与多对多关系相关的模型类:

@Entity
@XmlRootElement
@DynamicInsert (value = true)
@DynamicUpdate (value = true)
public class Matchs {

    @Id @GeneratedValue
    private Long matchId;
    private int size;
    private Date begins;
    private Date cutOff;
    private BigDecimal buyIn;

    @ManyToMany
    private List<Users> users;
}

@Entity
@XmlRootElement
@DynamicInsert (value = true)
@DynamicUpdate (value = true)
public class Users {

    @Id
    private String username;
    private String lastName,firstName,password,email;

    private Date dateOfBirth;

    @ManyToMany
    private List<Matchs> matchs;
}

I'm using a DAO to get a Match with all associated Users: 我正在使用DAO与所有相关用户进行匹配:

public Matchs findMatchWithUsers(long matchId) 
{
    if (matchId <= 0)
        throw new IllegalArgumentException("Match Id cannot be less than or equal to zero");

    try {
        begin();
        Matchs match = (Matchs) getSession().get(Matchs.class, matchId);

        if (match != null)
            Hibernate.initialize(match.getUsers());

        commit();
        close();
        return match;
    } catch (HibernateException e) {
        rollback();
        close();
        throw e;
    }
}

I then call a Jersey web service: 然后我调用Jersey网站服务:

   @GET
@Path ("getMatch/{matchId}")
@Produces (MediaType.APPLICATION_JSON)
public Response getMatchById  (@PathParam ("matchId")long matchId)
{
    MatchDAO matchDAO = DAO.getInstance(MatchDAO.class);
    Matchs match = matchDAO.findMatchWithUsers(matchId);

    if (match != null)
        return Response.ok()
                       .entity(new GsonBuilder().setPrettyPrinting().create().toJson(match))
                       .build();

    return Response.status(Status.NOT_FOUND).entity("Match was not located").build();
}

But this throws the following exception: 但是这引发了以下异常:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.kyrogaming.models.Users.matchs, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:95)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
at com.google.gson.Gson.toJson(Gson.java:593)
at com.google.gson.Gson.toJson(Gson.java:572)
at com.google.gson.Gson.toJson(Gson.java:527)
at com.google.gson.Gson.toJson(Gson.java:507)
at com.kyrogaming.services.MatchService.getMatchById(MatchService.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:521)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
at org.eclipse.jetty.server.Server.handle(Server.java:349)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:449)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:910)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:76)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534)

Where have I gone wrong because I really don't have a clue why the User proxy objects are not initializing. 我哪里出错了,因为我真的不知道为什么用户代理对象没有初始化。

This is Abstract class is extended by All Hibernate DAO classes and contains methods to interact with hibernate. 这是Abstract类,由All Hibernate DAO类扩展,包含与hibernate交互的方法。

public abstract class AbstractHibernate <T>{
private SessionFactory sessionFactory;

private Session session;

@Inject
public void setSessionFactory (SessionFactory sessionFactory)
{
    this.sessionFactory = sessionFactory;
}



protected Session getSession () 
{
    if (sessionFactory == null)
        throw new NullPointerException("SessionFactory null ");
    if (session == null)
    {
        session = sessionFactory.openSession();
        return session; 
    }
    return session;
}


public void begin ()
{
    getSession().beginTransaction();
}



public void commit () throws HibernateException
{
    getSession().getTransaction().commit();
}


public void rollback ()
{
    getSession().getTransaction().rollback();
}


protected void close ()
{
    if (getSession () != null)
    {
        session.close();
        session = null;
    }
}

I assume the code in .entity(new GsonBuilder().setPrettyPrinting().create().toJson(match)) is calling User.getMatchs() but because you have closed your session, it can't load them lazily. 我假设.entity(new GsonBuilder().setPrettyPrinting().create().toJson(match))的代码.entity(new GsonBuilder().setPrettyPrinting().create().toJson(match))正在调用User.getMatchs()但是因为你已经关闭了你的会话,所以它不能User.getMatchs()加载它们。 You should either load them eagerly or load before closing the session. 您应该在关闭会话之前急切地加载它们或加载它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Hibernate org.hibernate.LazyInitializationException:懒得初始化角色集合: - Hibernate org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: @ElementCollection 获取集合抛出错误 &#39;org.hibernate.LazyInitializationException&#39; - @ElementCollection get collection throw error 'org.hibernate.LazyInitializationException' org.hibernate.LazyInitializationException:懒得初始化角色集合 - org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role 引起原因:org.hibernate.LazyInitializationException:无法延迟初始化角色集合: - Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Hibernate org.hibernate.LazyInitializationException:无法初始化 - Hibernate org.hibernate.LazyInitializationException: could not initialize Hibernate抛出org.hibernate.LazyInitializationException - Hibernate threw org.hibernate.LazyInitializationException org.hibernate.LazyInitializationException(Spring / Hibernate) - org.hibernate.LazyInitializationException (Spring/Hibernate) 事务内的org.hibernate.LazyInitializationException - org.hibernate.LazyInitializationException within Transaction 在TestNGTests上获取org.hibernate.LazyInitializationException - Getting org.hibernate.LazyInitializationException on a TestNGTests 方法抛出“org.hibernate.LazyInitializationException”异常 - Method threw 'org.hibernate.LazyInitializationException' exception
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM