2012-06-26 39 views
0

我正在使用Hibernate 4.0.1.Final。我試圖在我的DAO對象上運行JUnit測試,但遇到了異常,「createCriteria在沒有活動事務的情況下無效」。奇怪的是,我在調用DAO方法之前開始了事務。我有爲什麼我得到「createCriteria無效,沒有活動事務」異常?

@Test 
public void testFindProductByTitle() { 
    final Session session = sessionFactory.openSession(); 
    final Transaction tx = session.beginTransaction(); 
    final Product product = productDao.findByTitle(testProps.getProperty("test.product.name")); 
    tx.commit(); 
    session.close(); 
    Assert.assertNotNull(product); 
    Assert.assertEquals(testProps.getProperty("test.product.name"), product.getName()); 
} 

我的DAO由

public Product findByTitle(String title) { 
    final Session session = sessionFactory.getCurrentSession(); 
    final Criteria criteria = session.createCriteria(Product.class); 
    criteria.add(Restrictions.eq("name", title)); 
    final List<Product> results = criteria.list(); 
    final Product result = results.get(0); 
    return result; 
} 

代碼死在 「最終標準條件= session.createCriteria(Product.class);」除了...

org.hibernate.HibernateException: createCriteria is not valid without active transaction 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:346) 
    at $Proxy21.createCriteria(Unknown Source) 
    at org.myco.myproj.dido.dao.lycea.ProductDAOImpl.findByTitle(ProductDAOImpl.java:20) 
    at org.myco.myproj.dao.ProductDAOTest.testFindByProductTitle(ProductDAOTest.java:32) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

任何想法發生了什麼問題? Junit測試中的sessionFactory與我初始化我的DAO測試的sessionFactory相同。

回答

3

getCurrentSession()不會返回與openSession()相同的會話。前者返回上下文(默認情況下爲線程綁定)會話。後者創建了一個新的會話,與上下文會話不同。

0

只是削減從虛空testFindProductByTitle(一行)並粘貼到產品findByTitle(String)方法即:

final Transaction tx = session.beginTransaction(); 
相關問題