休眠时出现“找不到表”异常

问题描述 投票:0回答:13

我在休眠时遇到以下异常:

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)

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

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

提前致谢!

hibernate
13个回答
10
投票

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

提高日志级别并使用

-Dhibernate.show_sql=true
启用 SQL 语句的日志记录。这应该有助于追踪这个。

[编辑] 另请确保

@Table
注释之前或之后没有空格。如果你有这个注释:

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

然后 Hibernate 将使用引用的名称来创建表(因此您将拥有一个具有 SQL 名称

'MYTABLE '
的表),但在运行查询时它不会总是引用该名称。


6
投票

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


4
投票

还要确保大小写正确。您可能会将其存储在数据库中,就像 dummy_table 一样。


4
投票

当我改变时为我工作 @Table(name = "schema.table") 到 @Table(名称=“表”,架构=“架构”)


3
投票

我在 mysql 数据库上也遇到了同样的问题。 问题是我对表使用了大写名称。 我把它们放下来,现在一切正常了。


1
投票

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

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

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


1
投票

就我而言,区分大小写很重要。虽然在 hibernate 映射中声明 table='DUMMY_TABLE' 在 Windows 机器上完全有效,但在将 mysql 服务器移动到 Linux 系统后它不起作用。我必须将所有大写字母更改为小写,例如 table='dummy_table'


1
投票

就我而言,我使用的是 H2。我有一列是保留字(请参阅H2 保留字

这真的很令人沮丧,因为没有错误消息被踢出。 sql调试显示正在创建表。


0
投票

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

<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>

0
投票

我从休眠中得到了同样的异常。 就我而言,这是因为数据库用户没有被正确授权查看这些表。这些表确实存在于数据库中。

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

但是,在另一种情况下,表实际上并不存在,我从休眠中得到了完全相同的异常。在表格存在的情况下,我认为出于安全原因,休眠可能不会显示更多信息。


0
投票

我正在使用 Flyway 数据库迁移,对于 Oracle,由于单个用户、单个架构的限制,我不得不强制所有微服务使用相同的架构。 令人惊讶的是,很少有微服务能够读取从依赖库加载的公用表,但 Kubernetes 部署在其间创建的一项服务因此错误而失败。

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

设置 ddl-auto=none

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

0
投票

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

缺少表:OLD_NAME

即使我确信我已经更新了所有参考资料。

事实证明我必须在 Eclipse 中进行 Maven Clean,这解决了这个问题。


0
投票

如果您的表已分区,请确保您的

application.yml
中有以下属性:

spring:
  jpa:
    properties:
        hibernate:
            hbm2ddl:
                extra_physical_table_types: PARTITIONED TABLE
© www.soinside.com 2019 - 2024. All rights reserved.