hibernate表不存在错误

时间:2010-12-20 15:18:40

标签: hibernate

在配置hibernate.cfg.xml中,我添加 <property name="hibernate.hbm2ddl.auto">create</property> 当我运行应用程序时,Hibernate会自动创建表。但是,我通过运行drop table sql手动从数据库中删除表。然后再次运行hibernate应用程序。出现例外

  

引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'test.person'不存在

解决问题的唯一方法是重启Mysql数据库。谁能为我解释这个问题?

这是我的hibernate.cfg.xml

<hibernate-configuration>  
<session-factory>  
    <property name="hibernate.connection.driver_class">  
        com.mysql.jdbc.Driver  
    </property>  
    <property name="hibernate.connection.url">  
        jdbc:mysql://localhost/test
    </property>  
    <property name="connection.username">root</property>  
    <property name="connection.password">root</property>  
    <property name="dialect">  
        org.hibernate.dialect.MySQLDialect  
    </property>  


    <!-- Drop and re-create the database schema on startup -->
    <property name="hibernate.hbm2ddl.auto">create</property>  

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Mapping files -->  
    <mapping resource="com/mapping/Event.hbm.xml" />  
    <mapping resource="com/mapping/Person.hbm.xml"/>
</session-factory>  

Thx

10 个答案:

答案 0 :(得分:12)

我不相信使用create会更新就地架构以重新添加您删除的表。尝试:

<property name="hibernate.hbm2ddl.auto">update</property>

如果不存在,则创建一个模式,并尝试修改现有模式以匹配您定义的映射。

另外,请阅读this question了解所有可能的值。

答案 1 :(得分:5)

“property”和“name”之间是否有空格?

<propertyname="hibernate.hbm2ddl.auto">create</property>

如果没有,则可能是问题所在。另外,当你“重新启动MySQL数据库”时,你的意思是什么?这是否意味着您只需重新启动MySQL服务器,或者这意味着您需要手动重新创建表?此外,如果上面的XML摘录确实包含“property”和“name”之间的空格,请同时提供hibernate日志的除外,特别是它列出了它标识的所有属性的部分。

答案 2 :(得分:5)

请从以下位置更改代码:

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

至:

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

尝试一下。

答案 3 :(得分:2)

我有同样的问题。我观察到我使用auto_increment(我使用MySQL Dialect)作为String字段。我把它改成了int来解决问题

答案 4 :(得分:1)

请从以下位置更改代码:

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

至:

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

尝试一下。就我而言,它确实有效。

答案 5 :(得分:0)

org.hibernate.dialect.MySQLDialect

对于mySQL数据库,必须将方言属性更改为以下内容:

org.hibernate.dialect.MySQL5Dialect

默认情况下,MySQL数据库配置的InnoDB存储引擎不支持MySQLDialect随附的

,这是在“默认”架构中创建表的默认设置。

答案 6 :(得分:0)

我在Maven Project-Hibernate中遇到了同样的问题。 我对我的pom.xml文件有这种依赖性:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.8.Final</version>
</dependency>
<!-- Mysql Connector -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.21</version>
</dependency>

这解决了我的休眠配置文件问题-使用MySQL5Dialect而不是MySQLDialect的hibernate.dialect:

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

似乎“ MySQL5Dialect”数字指定了MySQL的版本

答案 7 :(得分:0)

在类上需要提供重要的名称:

@Entity
@Table(name = "person")
public class Person{
}

在persistence.xml中,您需要检查持久单元名称是否与EntityManagerFactory名称相同。

答案 8 :(得分:0)

您错过了更新属性。

<property name="hibernate.hbm2ddl.auto">update</property>

也要更改:

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

收件人:

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

它将正常工作。

答案 9 :(得分:0)

使用

<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

根据您的mysql版本。如果您使用的是mysql-8,请编写以下代码:

<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>