2013-03-15 60 views
0

你好我是Hibernate的新手。Hibernate-Spring Web容器錯誤

我用Hibernate Tools生成了一個數據庫訪問模塊。生成器生成DAOS和Hibernate Bean的代碼。

當我在一個簡單的Java應用程序中測試這個模塊時,所有工作都很好,但是當我在Spring Web應用程序中測試它時,出現了一個非常奇怪的錯誤。由於我的模塊是一個獨立的jar,因此應該訪問數據庫而不考慮在簡單的Java應用程序或Web應用程序中執行的情況。我的web應用程序的代碼是:

@Controller 
    @RequestMapping("/") 
    public class Controller implements ApplicationContextAware 
    { 


    private ApplicationContext applicationContext; 


    @RequestMapping(value = "/purchased/songs", method = RequestMethod.GET) 
    public String home(Model model) 
    { 

    SessionManager.startOperation(); 

    ChargeTryDAOBase ctdb=new ChargeTryDAOBase(); 

    List <ChargeTry> data=ctdb.findByRemoteId("dsfsdfsdf8"); 


    SessionManager.endOperation(); 

    model.addAttribute("result", "data"); 

    return "home"; 
    } 



    @Override 
    public void setApplicationContext(ApplicationContext arg0) throws BeansException 
    { 
    this.applicationContext = arg0; 
    } 

} 

當運行在Tomcat這個代碼,我得到以下錯誤:

org.springframework.web.util.NestedServletException: Handler processing 
nested exception is java.lang.NoSuchMethodError: 
org.hibernate.SessionFactory.getCurrentSession()Lorg/hibernate/Session; 

    .....   

java.lang.NoSuchMethodError: 
org.hibernate.SessionFactory.getCurrentSession()Lorg/hibernate/Session; 

當我改變了一些Hibernate依賴我獲得以下錯誤:

java.lang.IllegalStateException: Could not locate SessionFactory in JNDI 

當我在簡單的Java應用程序中測試上述代碼時,所有代碼都可以正常工作。

這是spring-hibernate的配置問題嗎?

謝謝你的幫助。

+2

您是否在Spring配置文件中配置了所有必需的Hibernate屬性?你可以發佈這些嗎? – 2013-03-15 09:29:28

+0

我的休眠屬性文件是: – amartin 2013-03-15 09:37:45

+0

我有一個封裝了數據庫訪問功能的jar,並且在普通的Java應用程序中,我只需要添加這個模塊來訪問數據庫,它可以從零開始工作,但是使用Spring它不起作用。 – amartin 2013-03-15 10:01:19

回答

0

請研究

1:http://www.javatpoint.com/hibernate-and-spring-integration

http://viralpatel.net/blogs/spring3-mvc-hibernate-maven-tutorial-eclipse-example/

讓Spring MVC和Hibernate集成的洞察力。

你可以用Hibernate配置文件的工作 - 這裏是鏈接 -

Spring and hibernate.cfg.xml

但作爲您的應用程序是一個Spring管理的容器中,我們將強烈建議使用applicationContext.xml中進行更好的維護和代碼庫和性能的管理。

+0

但是我已經在我的jar中配置了一個hibernate.cfg.xml,在這裏我配置了我的數據源的所有屬性。我是否必須在Spring中再次配置hibernate.cfg.xml中指定的屬性?謝謝。 – amartin 2013-03-15 10:32:20

+1

在Spring容器託管bean中,在上面第一個鏈接的applicationcontext.xml中配置hibernate屬性是Spring中的一個最佳實踐。 – 2013-03-15 10:35:34

+0

謝謝你的迴應。但是,是否可以將所有hibernate配置封裝在我jar包含的hibernate.cfg.xml中,而不必在我的上層Spring層中配置它?非常感謝您的建議和幫助。 – amartin 2013-03-15 10:41:36

0

謝謝你的幫助,終於我得到了所有的工作。我遵循你的鏈接,並搜索了一下。問題是我沒有在我的hibernate.cfg.xml文件中啓用datasource參數,我也配置了C3P0 jdbc連接提供程序。

我最後hibernate.cfg.xml文件是:

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.bytecode.use_reflection_optimizer">true</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
     <property name="current_session_context_class">thread</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property> 
     <property name="hibernate.connection.username">userdb</property> 
     <property name="hibernate.connection.password">12345</property> 
     <property name="hibernate.connection.datasource">java:comp/env/jdbc/mydb</property> 
     <property name="hibernate.format_sql">true</property> 
     <property name="hibernate.use_sql_comments">true</property> 


     <property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property> 
     <property name="hibernate.c3p0.min_size">2</property> 
     <property name="hibernate.c3p0.numHelperThreads">4</property> 
     <property name="hibernate.c3p0.max_size">10</property> 
     <property name="hibernate.c3p0.timeout">300</property> 
     <property name="hibernate.c3p0.max_statements">100</property> 
     <property name="hibernate.c3p0.idle_test_period">1800</property> 
     <property name="hibernate.c3p0.acquire_increment">2</property> 
    <hibernate-configuration> 
    <session-factory> 

在我的web.xml我加入以下行:

<resource-ref> 
    <description>This is a MySQL database connection</description> 
    <res-ref-name>jdbc/mydb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref>  

在我加入以下幾行Spring上下文文件:

<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <beans:property name="url" value="jdbc:mysql://localhost:3306/mydb"/> 
     <beans:property name="username" value="userdb"/> 
     <beans:property name="password" value="12345"/> 
    </beans:bean> 

    <beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <beans:property name="dataSource" ref="dataSource" /> 
     <beans:property name="configLocation"> 
     <beans:value>classpath:hibernate.cfg.xml</beans:value> 
     </beans:property> 
    </beans:bean> 

奇怪的是,用默認的Hibernate連接提供程序,上面的解決方案沒有w奧克,但是當我配置C3P0都開始工作。

謝謝你的幫助。