"表未找到" hibernate异常

时间:2010-12-06 11:23:57

标签: hibernate

我在使用hibernate时遇到以下异常:

10:18:14,795 INFO  [SchemaValidator] Running schema validator

10:18:14,795 INFO  [SchemaValidator] fetching database metadata

10:18:16,958 INFO  [DatabaseMetadata] table not found: DUMMY_TABLE

10:18:16,963 ERROR [AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=bkoMdw-ear.ear/bkoMdw-ejb.jar#bkoMdw state=Create
javax.persistence.PersistenceException: [PersistenceUnit: bkoMdw] Unable to build EntityManagerFactory

(...)

Caused by: org.hibernate.HibernateException: Missing table: DUMMY_TABLE
     at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1127)
     at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:139)
     at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:359)
     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
     at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
     at 

org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)

问题是该表存在且数据源文件已正确配置。

我缺少什么?有什么建议来解决这个问题吗?

提前致谢!

11 个答案:

答案 0 :(得分:8)

问题是您认为表存在且数据源是否已正确配置,而Hibernate 知道这是不正确的。

增加日志级别并使用-Dhibernate.show_sql=true启用SQL语句的日志记录。这应该有助于追踪这一点。

[编辑] 同时确保@Table注释之前或之后没有空格。如果你有这个注释:

@Table(name = "myTable ") // Note the space after the name!!

然后Hibernate将使用引用的名称来创建表(因此您将拥有一个SQL名称为'MYTABLE '的表),但在运行查询时它并不总是引用该名称。

答案 1 :(得分:6)

我在我的映射中使用的视图遇到了同样的问题。在我禁用了Hibernate的验证后,它可以正常工作。看来,验证存在视图问题。

答案 2 :(得分:4)

同时确保案例正确无误。您可能在数据库中拥有它,因为虚拟表可能是。

答案 3 :(得分:3)

我改变时为我工作 @Table(name =&#34; schema.table&#34;) 至 @Table(name =&#34; table&#34;,schema =&#34; schema&#34;)

答案 4 :(得分:2)

我遇到了与mysql数据库相同的问题。 问题是我使用表格的大写名称。 我放下它们,现在一切正常。

答案 5 :(得分:0)

@Hendrik有正确的想法。我遇到了同样的问题,我可以通过将bean添加到我的应用程序上下文文件中来解决问题。

<bean id="dbUnitDatabaseConfig" class="com.github.springtestdbunit.bean.DatabaseConfigBean">
    <property name="caseSensitiveTableNames" value="false"/>
    <property name="qualifiedTableNames" value="true"/>
    <property name="datatypeFactory">
        <bean class="org.dbunit.ext.mysql.MySqlDataTypeFactory"/>
    </property>
    <property name="metadataHandler">
        <bean class="org.dbunit.ext.mysql.MySqlMetadataHandler"/>
    </property>
</bean>
<bean id="dbUnitDatabaseConnection" class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean">
    <property name="databaseConfig" ref="dbUnitDatabaseConfig"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="transactionAware" value="true"/>
    <property name="schema" value="yourSchemaName"/>
</bean>

答案 6 :(得分:0)

我从hibernate得到了同样的异常。 在我的情况下,这是因为没有正确授权数据库用户查看表。表格最终存在于数据库中。

我将角色 db_datareader 分配给该数据库的用户后,它就可以了。

然而,在另一种情况下,表实际上并不存在,我从hibernate获得了完全相同的异常。我遇到表格的情况,我认为由于安全原因,hibernate可能不会显示更多信息。

答案 7 :(得分:0)

我遇到了类似postgresql和hibernate 5.2.10的问题。

桌子肯定存在。当我关闭验证时,一切正常。事实证明,可能无法找到该表,因为hibernate无法处理任何指定的架构。它似乎与:https://hibernate.atlassian.net/browse/HHH-11286有关。

我更新了postgresql和方言(PostgreSQLXXDialect)。之后问题就消失了。

答案 8 :(得分:0)

就我而言,区分大小写很重要。虽然在休眠映射中声明table ='DUMMY_TABLE'完全可以在Windows计算机上运行,​​但是将mysql服务器移至linux系统后无法正常工作。我不得不将所有大写字母更改为小写,例如table ='dummy_table'

答案 9 :(得分:0)

我正在使用flyway db迁移,对于oracle,由于一个用户,一个模式的限制,我不得不强制所有微服务使用相同的模式。 令人惊讶的是,很少有微服务能够从从属库读取公共表加载,但是由Kubernetes部署在两者之间创建的一项服务因此错误而失败。

以下设置有助于解决该问题:

设置ddl-auto = none

# JPA Configuration
  jpa:
    database-platform: ${DB_DIALECT:org.hibernate.dialect.Oracle12cDialect}
    hibernate:
      ddl-auto: none

答案 10 :(得分:0)

对我来说,重命名表后出现此错误,但仍然在说:

缺少表:OLD_NAME

即使我确定我会更新所有参考。

事实证明,我必须在Eclipse中进行Maven清理,然后将其修复。