在配置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
答案 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>