使用 JUnit 测试 Hibernate:“会话已关闭”例外

发布于 2024-08-27 19:14:29 字数 149 浏览 5 评论 0原文

有时,当使用 JUnit 4.5 在我的 DAO 类中测试某些 CRUD 操作时,Hibernate 会抛出异常:

org.hibernate.SessionException:会话已关闭!

会话没有显式关闭,那么会发生什么呢?

谢谢

sometimes when testing some CRUD operations in my DAO classes using JUnit 4.5, Hibernate throws an exception:

org.hibernate.SessionException: Session is closed!

The session is not closed explicitly, so what happens?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

月下伊人醉 2024-09-03 19:14:29

我使用下面列出的代码片段,没有遇到任何问题

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.*;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class ComponentsTest {
    private static SessionFactory sf;
    private static Session s;
    private static Transaction tx;

    @BeforeClass
    public static void setUp() {
        sf = new AnnotationConfiguration().configure().buildSessionFactory();
    }

    @AfterClass
    public static void tearDown() {
        sf.close();
    }

    @Before
    public void open() {
        s = sf.openSession();
        tx = s.beginTransaction();
    }

    @After
    public void close() {
        tx.commit();
        s.close();
    }
    @Test
    public void testSth(){
       // 
    }

I use snippet listed below, and I didn't encounter any problems

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.*;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class ComponentsTest {
    private static SessionFactory sf;
    private static Session s;
    private static Transaction tx;

    @BeforeClass
    public static void setUp() {
        sf = new AnnotationConfiguration().configure().buildSessionFactory();
    }

    @AfterClass
    public static void tearDown() {
        sf.close();
    }

    @Before
    public void open() {
        s = sf.openSession();
        tx = s.beginTransaction();
    }

    @After
    public void close() {
        tx.commit();
        s.close();
    }
    @Test
    public void testSth(){
       // 
    }
咋地 2024-09-03 19:14:29

假设您的事务管理器设置正确,以下代码将使您的会话保持打开状态:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext*.xml")
public class SpringTest {

    @Autowired private MyObjectDao myObjectDao;

    @Test
    @Transactional
    public void test() throws IOException {
        MyObject object = myObjectDao.find(objectId);
        object.setProperty("propertyValue");
        MyObject savedObject = myObjectDao.save(object);
        assertEquals(object.getProperty(), savedObject.getProperty());
    }
}

Assuming your transaction manager is setup correctly, the following code will keep your session open:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext*.xml")
public class SpringTest {

    @Autowired private MyObjectDao myObjectDao;

    @Test
    @Transactional
    public void test() throws IOException {
        MyObject object = myObjectDao.find(objectId);
        object.setProperty("propertyValue");
        MyObject savedObject = myObjectDao.save(object);
        assertEquals(object.getProperty(), savedObject.getProperty());
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文