我有两种方法:
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 :(得分:0)
在返回之前尝试关闭proSess
中的getSeatByID()
。目前Seat
确实仍然附加在getSeatByID()
中打开的会话。
答案 1 :(得分:0)
我遇到了同样的问题。但是在使用单例模式进行会话之后我就完成了。我使用的是Hibernate 4.2.x。
这是我的会话类用于获取数据库事务的会话等。
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 Helper Class I使用。
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();
}
}
答案 2 :(得分:0)
我在尝试关联Envers会话中的实体时遇到了这个问题。
修正了通过“刷新”所述实体(通过PK获取在我的非Envers会话中检索它),然后将其冒泡到我的算法中。
答案 3 :(得分:0)
使用session.opensession().get(.....)
..代替session.opensession().load(.....)
答案 4 :(得分:-1)
如果你在提交proCess之前做了一个proCess.evict(c)怎么办?