2017-04-08 120 views
1

錯誤日誌:org.springframework.transaction.CannotCreateTransactionException:無法打開Hibernate Session對象交易

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.372 sec <<< FAILURE! 
testCRUDCategory(net.kzn.shoppingbackend.test.CategoryTestCase) Time elapsed: 0.124 sec <<< ERROR! 
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection 
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:542) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:447) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy32.add(Unknown Source) 

HibernateConfig.java

@Configuration 
@ComponentScan(basePackages={"net.kzn.shoppingbackend.dto"}) 
@EnableTransactionManagement 
public class HibernateConfig { 

    // Change the below based on the DBMS you choose 
    private final static String DATABASE_URL = "jdbc:h2:tcp://localhost/~/onlineshopping"; 
    private final static String DATABASE_DRIVER = "org.h2.Driver"; 
    private final static String DATABASE_DIALECT = "org.hibernate.dialect.H2Dialect"; 
    private final static String DATABASE_USERNAME = "sa"; 
    private final static String DATABASE_PASSWORD = ""; 

    // dataSource bean will be available 
    @Bean 
    public DataSource getDataSource() { 

     BasicDataSource dataSource = new BasicDataSource(); 

     // Providing the database connection information 
     dataSource.setDriverClassName(DATABASE_DRIVER); 
     dataSource.setUrl(DATABASE_URL); 
     dataSource.setUsername(DATABASE_USERNAME); 
     dataSource.setPassword(DATABASE_PASSWORD); 


     return dataSource; 

    } 

    // sessionFactory bean will be available 

    @Bean 
    public SessionFactory getSessionFactory(DataSource dataSource) { 

     LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource); 

     builder.addProperties(getHibernateProperties()); 
     builder.scanPackages("net.kzn.shoppingbackend.dto"); 

     return builder.buildSessionFactory(); 

    } 



    // All the hibernate properties will be returned in this method 
    private Properties getHibernateProperties() { 

     Properties properties = new Properties(); 


     properties.put("hibernate.dialect", DATABASE_DIALECT);  
     properties.put("hibernate.show_sql", "true"); 
     properties.put("hibernate.format_sql", "true"); 


     return properties; 
    } 

    // transactionManager bean 
    @Bean 
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) { 
     HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory); 
     return transactionManager; 
    } 


} 

測試類 CategoryTestCase.java

public class CategoryTestCase { 

    private static AnnotationConfigApplicationContext context; 


    private static CategoryDAO categoryDAO; 


    private Category category; 


    @BeforeClass 
    public static void init() { 
     context = new AnnotationConfigApplicationContext(); 
     context.scan("net.kzn.shoppingbackend"); 
     context.refresh(); 
     categoryDAO = (CategoryDAO)context.getBean("categoryDAO"); 
    } 


    @Test 
    public void testAddCategory() { 

     category = new Category(); 

     category.setName("Laptop"); 
     category.setDescription("This is some description for laptop!"); 
     category.setImageURL("CAT_105.png"); 

     assertEquals("Successfully added a category inside the table!",true,categoryDAO.add(category)); 


    } 
} 

爲什麼我得到無法打開休眠會話tra nsaction;嵌套的異常,似乎一切都很好,爲什麼這個錯誤我得到 您可以檢查git的樞紐代碼過於它的同一個問題好心幫我解決這個問題 https://github.com/rustyamigo/online-shopping

+0

確保您的數據庫URL與其他參數一樣正確。與數據庫的連接沒有建立。 –

+0

檢查出: http://stackoverflow.com/questions/6965794/jpa-connection-with-h2-database – Sarkhan

+0

可能重複[JPA與H2數據庫連接](http://stackoverflow.com/questions/6965794/JPA-連接與-H2-數據庫) – Sarkhan

回答

0

我已經克隆你的項目,發現Connection is broken: "java.net.ConnectException: Connection refused: localhost" [90067-194]),你似乎沒有啓動H2服務器。根據你的URL,你使用tcp連接,即服務器必須先啓動。

我有一些谷歌上搜索,發現可以通過2種方式解決這個問題:

你需要一個Java高手程序,啓動服務器這樣的: org.h2.tools.Server.createTcpServer().start(); 例如: 在您的測試類 - > ProductTestCase.java

@BeforeClass 
public static void init() throws Exception { 
    org.h2.tools.Server.createTcpServer().start(); 
    context = new AnnotationConfigApplicationContext(); 
    context.scan("net.kzn.shoppingbackend"); 
    context.refresh(); 
    productDAO = (ProductDAO)context.getBean("productDAO"); 
} 

,或者你可以手動啓動它之前,你的連接嘗試這樣的: java -cp h2*.jar org.h2.tools.Server

相關問題