2

私はHibernate4.1.2で実験しています。

新しいServiceRegistryアプローチを使用してセッションを取得できるように、次のクラスを作成しました

================================================== ===

package com.debaself.samples;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;


public class SessionFetch {

private static SessionFactory sessionFactory = null;

public SessionFactory getSessionFactory(){

if(sessionFactory == null){
         Configuration cfg = new    AnnotationConfiguration().addResource("hibernate.cfg.xml").configure();

ServiceRegistry serviceRegistry = new     ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
        sessionFactory = cfg.buildSessionFactory(serviceRegistry);
    }

    return sessionFactory ;
}

public Session getSession(){
    return getSessionFactory().openSession();
}
}

===============================================

今、私はテストを書きました

===============================================

public class SessionFetchTest {

    @Test 
    public void getSessionFactoryTest(){
        SessionFetch fetch = new SessionFetch();
        SessionFactory factory = fetch.getSessionFactory();

        assertNotNull(factory);
        assert(!factory.isClosed());
        factory.close();
    }

    @Test
    public void getSessionTest(){
        SessionFetch fetch = new SessionFetch();
        Session session = fetch.getSession();

        assert(session.isOpen());
        assert(session.isConnected());      
    }
}

==================================================

奇妙さは

テストメソッドを個別に実行すると、両方のテストが成功します。しかし、一度に実行すると、getSessionTest()は必ず失敗し、UnknownServiceExceptionがスローされます。

誰かがこの振る舞いを説明できますか?

4

2 に答える 2

0

コメントで言ったように、工場は閉鎖されています。たぶん@AfterClassセクションでそれを閉じますか?

于 2012-07-30T12:32:50.940 に答える
0

あなたの当面の質問はすでに答えられていますが、あなたのコードには追加の問題があることに注意してください。単体テストは相互依存性なしで実行可能であると想定されていますが、コードには当てはまりません。テスト間で同じセッションを再利用します。また、ファクトリを再利用し、1回のテストで閉じることもできます。また、テストは複数のスレッドで実行される可能性があり、コードはスレッドセーフではありません(ファクトリリファレンスは適切に共有されません)。

于 2012-07-30T12:35:07.190 に答える