【问题标题】:Why is Hibernate throwing a SQLGrammarException saying table/view does not exist when I've set hbm2ddl.auto to create?为什么当我将 hbm2ddl.auto 设置为创建时,Hibernate 会抛出 SQLGrammarException 说表/视图不存在?
【发布时间】:2012-05-26 13:46:26
【问题描述】:

我一直在尝试使用 hibernate、spring 和 servlet。现在,我被困住了。为什么我会收到此异常?我认为当 hbm2ddl.auto 设置为创建时会自动创建表。

appicationContext.xml

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" />
    <property name="url" value="jdbc:derby://localhost:1527/db;create=true" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="org.springpractice.domain" />
    <property name="hibernateProperties">
        <props>
            <prop key="dialect">
                org.hibernate.dialect.DerbyTenSevenDialect</prop>
            <prop key="show_sql">true</prop>
            <prop key="cache.provider_class">
                org.hibernate.cache.NoCacheProvider</prop>
            <prop key="hbm2ddl.auto">create</prop>
        </props>
    </property> 
</bean>

UserDetails.java

package org.springpractice.domain;

@Entity
public class UserDetails {

    @Id @GeneratedValue
    protected int id;
    protected String name;
    protected String email;

    // setters/getters ...
}

Main.java

@WebServlet("/")
public class Main extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter pw = response.getWriter();
        pw.println("hello from servlet");

        UserDetails user = new UserDetails();
        user.setEmail("bob.smith@gmail.com");
        user.setName("Bob Smith");

        ApplicationContext beanFactory =
            WebApplicationContextUtils
                .getRequiredWebApplicationContext(getServletContext());
        SessionFactory sessionFactory = (SessionFactory)     beanFactory.getBean("sessionFactory");
        Session session = sessionFactory.openSession();
        session.save(user);
        session.close();

    }

}

例外

org.hibernate.exception.SQLGrammarException: Table/View 'USERDETAILS' does not exist.
org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:146)
org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
$Proxy10.prepareStatement(Unknown Source)
...

【问题讨论】:

    标签: spring hibernate servlets sqlexception hbm2ddl


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      属性名称应以hibernate为前缀。

      <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
          <property name="dataSource" ref="dataSource" />
          <property name="packagesToScan" value="org.springpractice.domain" />
          <property name="hibernateProperties">
              <props>
                  <prop key="hibernate.dialect">
                      org.hibernate.dialect.DerbyTenSevenDialect</prop>
                  <prop key="hibernate.show_sql">true</prop>
                  <prop key="hibernate.cache.provider_class">
                      org.hibernate.cache.NoCacheProvider</prop>
                  <prop key="hibernate.hbm2ddl.auto">create</prop>
              </props>
          </property> 
      </bean>
      

      顺便说一句,有一种更简单的方法来配置属性,如下所示

          <property name="hibernateProperties">
              <value>
                  hibernate.dialect=org.hibernate.dialect.DerbyTenSevenDialect
                  hibernate.show_sql=true
                  hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
                  hibernate.hbm2ddl.auto"=create
              </value>
          </property> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 2014-09-25
        • 2017-04-10
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        相关资源
        最近更新 更多