0

您好,我是 Hibernate 的新手。

我用 Hibernate Tools 生成了一个数据库访问模块。生成器生成 DAOS 和 Hibernate Bean 的代码。

当我在一个简单的 Java 应用程序中测试这个模块时,一切正常,但是当我在一个 Spring Web 应用程序中测试它时,我得到了一个非常奇怪的错误。由于我的模块是一个独立的 jar,它应该访问数据库而不考虑在简单的 Java 应用程序或 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配置问题吗?

谢谢您的帮助。

4

2 回答 2

0

请学习

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

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

深入了解 Spring MVC 和 Hibernate 集成。

您可以使用 Hibernate 配置文件 - 这是链接 -

Spring 和 hibernate.cfg.xml

但由于您的应用程序位于 Spring 托管容器中,我们强烈建议使用 applicationcontext.xml 来更好地维护和管理代码库和性能。

于 2013-03-15T10:22:21.683 回答
0

谢谢你的帮助,我终于开始工作了。我按照你的链接搜索了一下。问题是我没有在 hibernate.cfg.xml 文件中启用数据源参数,我还配置了 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 连接提供程序,上述解决方案不起作用,但是当我配置 C3P0 时,一切都开始工作了。

谢谢您的帮助。

于 2013-03-25T07:50:21.617 回答