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)
4

5 に答える 5

0

戻る前に閉じてみてくださいproSessgetSeatByID()現在、Seat実際にで開かれたセッションに接続されたまま getSeatByID()です。

于 2013-01-24T15:17:48.710 に答える
0

私は同じ問題を抱えています。しかし、セッションにシングルトンパターンを使用した後、私は完了しました。Hibernate4.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;
    }
}

}

私が使用している休止状態のヘルパークラス。

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();
}

}

于 2014-09-03T06:27:37.443 に答える
0

Enversセッションからエンティティを関連付けようとしたときに、この問題が発生しました。

アルゴリズムにバブリングする前に、そのエンティティを「更新」する(PKフェッチを介して非Enversセッションで取得する)ことで修正しました。

于 2016-04-13T20:28:21.180 に答える
0

session.opensession().get(.....)の代わりに..を使用してくださいsession.opensession().load(.....)

于 2017-08-21T14:32:00.903 に答える
-1

proSessをコミットする前にproSess.evict(c)を実行するとどうなりますか?

于 2013-01-24T15:22:25.950 に答える