2

我正在尝试使用 Hibernate 4.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

您的直接问题已经得到解答,但请注意您的代码存在其他问题。单元测试应该是可执行的,没有相互依赖关系,但您的代码并非如此。您在测试中重复使用相同的会话。您还可以重用工厂,甚至在一次测试中关闭它。此外,测试可能在多个线程中运行,并且您的代码不是线程安全的(工厂引用不会被正确共享)。

于 2012-07-30T12:35:07.190 回答