2013-01-24 19 views
2

代理我有2个方法相关联:休眠:非法尝试与两个开放会话

public static Ticket issueTicket(User user,Service service,String[] seats) { 
    Session ticSess= DB.factory.openSession(); 
    ticSess.beginTransaction(); 
    Date d= new Date(); 
    Ticket ticket=new Ticket(d, service, user); 

    ticSess.save(ticket); 
    ticSess.getTransaction().commit(); 
    int seatCount=seats.length; 
    for (int i=0;i<seatCount;i++){ 
     int seatID=Integer.parseInt(seats[i]); 
     Seat seat=getSeatByID(seatID); 
     seat.setTicket(ticket); 
     ticSess.update(seat); 
    } 
    return ticket; 


} 

,并

public static Seat getSeatByID(int seatID) { 
    Session proSess = DB.factory.openSession(); 
    proSess.beginTransaction(); 
    Seat c = (Seat) (proSess.load(Seat.class, seatID)); 
    proSess.getTransaction().commit(); 

    return c; 
} 

当我打电话issueTicket方法获得:

illegally attempted to associate a proxy with two open Sessions 

如果我在getSeatByID方法中关闭会话,将会有另一个错误提示会话已关闭。这里是堆栈跟踪:

at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164) 
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285) 
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) 
at ir.ac.shirazu.cse.Terminal.Seat_$$_javassist_9.setTicket(Seat_$$_javassist_9.java) 
at ir.ac.shirazu.cse.Database.DB.issueTicket(DB.java:231) 
+0

后您添加的堆栈跟踪,似乎有一些延迟初始化发生在离开'getSeatByID后()'。只需在一个会话中完成所有操作,并且它将正常工作 –

回答

0

,请返回前关闭getSeatByID()proSess。目前Seat确实仍附在getSeatByID()开的会议上。

+0

如果我在getSeatByID方法中关闭会话,将会有另一个错误,告诉会话已关闭。 – Pishist

+0

@Pishist 你可以发送完整的“closed session”异常的堆栈跟踪吗?也许一些懒惰初始化发生在某个点上?另一件事是我不完全明白你为什么在一个单独的会话和交易中加载席位。您似乎打开了“每个数据库操作事务”,这基本上是一种反模式。 –

+0

我想如果我在同一个会话中加载座椅,问题就会解决。谢谢。 我应该做什么而不是每个数据库操作的事务? 我听说,交易不会影响数据库,直到我们关闭它们... – Pishist

-1

如果您在提交proSess之前执行proSess.evict(c),该怎么办?

1

我得到了同样的问题。但在使用单例模式进行会话后,我完成了。我使用Hibernate 4.2.x.

这是我的会话类是用来获取会话的DB交易等

public class SessionClass { 

static Session session = PoolManager.getSession(); 

public static Session getSession() { 
    if (session != null || session.isOpen()) { 
     return session; 
    } else { 
     session = PoolManager.getSession(); 
     return session; 
    } 
} 

}

Hibernate的助手我使用的是类。

public class PoolManager { 
private static final SessionFactory sessionFactory; 
private static final ServiceRegistry serviceRegistry; 

static { 
    try { 
     // Create the SessionFactory from standard (hibernate.cfg.xml) 
     // config file. 
     Configuration configuration = new Configuration(); 
     configuration.configure(); 

     serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); 
     sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
    } catch (Throwable ex) { 
     // Log the exception. 
     System.err.println("Initial SessionFactory creation failed." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 
} 

public static Session getSession() { 
    return sessionFactory.openSession(); 
} 

}

0

我试图将实体从Envers会话关联时,就遇到了这个问题。

修正了通过“刷新”所述实体(在我的非Envers会话中通过PK提取检索它),然后将其冒泡到我的算法。

0

使用session.opensession().get(.....) ..而不是session.opensession().load(.....)

相关问题