休眠表不存在错误
Posted
技术标签:
【中文标题】休眠表不存在错误【英文标题】:hibernate table does not exist error 【发布时间】:2011-05-28 07:40:11 【问题描述】:在配置 hibernate.cfg.xml 中,我添加
<property name="hibernate.hbm2ddl.auto">create</property>
当我运行应用程序时,Hibernate 会自动创建表。但是,我通过运行 drop table sql 手动从数据库中删除表。然后再次运行休眠应用程序。出现异常
原因: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>
谢谢
【问题讨论】:
你是怎么放下桌子的?在应用程序或命令行中?您是否在删除后停止您的应用程序? 感谢您的回复。我通过运行命令行而不是在应用程序中删除表。顺便说一句,我只是发现当我想在我按应用程序创建表后通过应用程序执行另一个操作时。异常也会抛出。有什么线索吗? 【参考方案1】:“属性”和“名称”之间是否有空格?
<propertyname="hibernate.hbm2ddl.auto">create</property>
如果不是,那可能就是问题所在。另外,当您“重新启动 MySQL 数据库”时它会修复是什么意思?是重启MySQL服务器,还是需要手动重新创建表?此外,如果上面的 XML 摘录确实包含“属性”和“名称”之间的空格,请同时提供除休眠日志之外的部分,特别是列出它识别的所有属性的部分。
【讨论】:
顺便说一句,我正在谈论的日志条目如下所示: 01:30:08,032 INFO Environment:540 - 从资源 hibernate.properties 加载属性:url=jdbc:hsqldb: hsqldb/hibernate, hibernate.connection.driver_class=org.hsqldb.jdbcDriver, hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider, schema=, hibernate.cache.use_query_cache=true, hibernate.dialect=org.hibernate.dialect .HSQLDialect,用户名=sa,hibernate.jdbc.use_streams_for_binary=true ... 抱歉我的打字错误。当异常抛出时,我重新启动 MySQL 服务器。但是,在我通过应用程序创建表之后。我想运行进一步的操作,例如读取、更新操作。 “表'test.person'不存在”异常抛出 您可以尝试从属性名称中删除“休眠”前缀吗? IIRC,它对 cfg.xml 文件无效,仅对 .properties 文件需要。另外,请【参考方案2】:我不相信使用create
会更新就地架构以重新添加您删除的表。试试:
<property name="hibernate.hbm2ddl.auto">update</property>
如果不存在,则创建一个架构,并尝试修改现有的架构以匹配您定义的映射。
另外,请阅读this question 了解所有可能的值。
【讨论】:
是的,我更改为更新。但问题仍然存在。我想重新添加表格,但继续抛出“表格'test.person'不存在”;该表应该是自动添加的。然后我必须重新启动我的 SQL 服务器。然后我可以添加表。我想我确实在事务之后运行了 commit() 和 close()。但是在第一次操作创建表后,它一直抛出“表'test.person'不存在”异常。 停止删除表格?如果要删除数据,请改用 DELETE FROM。 更好的是,如果您只想删除表中的所有行,请使用 TRUNCATE TABLE test.person。 我无法使用提供的表单,但这个表单对我来说很好用:<property name="hibernate.hbm2ddl.auto" value="update" />
【参考方案3】:
我遇到了同样的问题。我观察到我正在使用 auto_increment(我正在使用 MySQL 方言)作为字符串字段。我把它改成 int 解决了这个问题
【讨论】:
我今天遇到同样的问题,SQLException的问题是它只告诉你一个表不存在,并没有告诉你为什么不能创建表(Hibernate配置,列类型...)。【参考方案4】:请把代码改成:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
到:
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
试试看。
【讨论】:
【参考方案5】:请把代码改成:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
到:
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
试试看。这对我来说真的很有效。
【讨论】:
【参考方案6】:org.hibernate.dialect.MySQLDialect
如果是 mySQL 数据库,方言属性必须更改为:
org.hibernate.dialect.MySQL5Dialect
默认自带 MySQLDialect,不支持 MySQL 数据库配置的 InnoDB 存储引擎,这是在 Default schema 中创建表的默认设置。
【讨论】:
【参考方案7】:我在使用 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>
这解决了我在休眠配置文件上的问题 - hibernate.dialect 使用 MySQL5Dialect 而不是 MySQLDialect:
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
似乎数字“MySQL5Dialect”指定了 MySQL 的版本
【讨论】:
【参考方案8】:有一个重要的事情你需要给你的班级表名:
@Entity
@Table(name = "person")
public class Person
在您的 persistence.xml 中,您需要检查持久单元名称是否与 EntityManagerFactory 名称相同。
【讨论】:
【参考方案9】:您错过了更新属性。
<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>
它会正常工作的。
【讨论】:
【参考方案10】:使用
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
根据您的 mysql 版本。如果你使用的是 mysql-8,那么写这个:
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
【讨论】:
请阅读How do I write a good answer? 当我从 MySQLDialect 更改为 MySQL8Dialect 时,我完成了工作。非常感谢您的回答.. 没有任何效果,但这个对我有用,非常感谢以上是关于休眠表不存在错误的主要内容,如果未能解决你的问题,请参考以下文章