【问题标题】:Hibernate 5 Schema-validation: missing table with HBM filesHibernate 5 Schema-validation:缺少带有 HBM 文件的表
【发布时间】:2021-11-10 23:00:11
【问题描述】:

这个问题与我之前遇到的问题非常相似。我正在将现有的非 Spring 应用程序从 Hibernate 3.x 转换为最新的 5.6.0.Final(此时)。我们在 AWS 中使用 MariaDB,并且正在使用最新的 MariaDB 驱动程序。目前,我们仍在为旧表使用 HBM xml 文件,直到我们不再使用它们。

我们在数据库中确实有一个现有的表,我绝对可以确认这一点。错误如下:

09:32:22.950> ERROR   PersistenceManager:123 Initial SessionFactory creation failed.
org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [my_db.commtemplateinfos]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:121)
at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:200)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:81)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:327)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:728)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:746)
at com.myproject.server.services.db.service.PersistenceManager.buildSessionFactory(PersistenceManager.java:504)

因此,当我们尝试构建 SessionFactory 时会发生此错误。

我也可以为此提供一些配置:

<hibernate-configuration>
    <session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">org.mariadb.jdbc.Driver</property>
    <property name="connection.url">jdbc:mariadb://${mysql.host.name}:3306/${mysql.db.name}?characterEncoding=UTF-8&amp;serverTimezone=UTC</property>
    <property name="connection.username">${mysql.user.name}</property>
    <property name="connection.password"><![CDATA[${mysql.password}]]></property>
    
    <!-- Database Connection Limits -->
    <property name="initialSize">10</property>
    <property name="maxActive">15</property>
    <property name="maxWait">5000</property>
    <property name="maxIdle">1</property>
    <property name="hibernate.default_catalog">${mysql.db.name}</property>
    
    <!-- Naming Strategy -->
    <property name="hibernate.naming.physical-strategy">org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl</property>
    <property name="hibernate.naming.implicit-strategyy">org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl</property>

    <!-- SQL dialect -->
    <property name="hibernate.dialect">org.hibernate.dialect.MariaDB102Dialect</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="hibernate.transaction.coordinator_class">org.hibernate.transaction.JDBCTransactionFactory</property>
    <property name="current_session_context_class">thread</property>

    <!-- Configure the second-level cache  -->
    <property name="hibernate.cache.ehcache.missing_cache_strategy">create</property>
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.jcache.JCacheRegionFactory</property>
    <property name="hibernate.javax.cache.provider">org.ehcache.jsr107.EhcacheCachingProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">${hibernate.show.sql}</property>

    <!-- Update the database schema on startup -->
    <property name="hbm2ddl.auto">validate</property>

    <!-- Configure the connection Pool for Hibernate -->
    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

... mappings here ...
<mapping resource="com/myproject/server/model/Project.hbm.xml"/>

    </session-factory>
</hibernate-configuration>

我根据这里的一些其他帖子尝试了命名策略,但他们没有做任何事情。

这是 Project.hbm.xml 中此“列表”的定义:

<list name="commTemplateInfos" table="commtemplateinfos" cascade="all, delete-orphan" lazy="false">
    <key column="projectId" not-null="false" />
    <list-index column="listIndex" />
    <composite-element class="com.myproject.server.model.CommTemplateInfo" >
        <property name="name"   not-null="false" />
        <property name="frequency"   not-null="false" />
    </composite-element>
</list>

我想我已经提供了我需要提供的一切。我已经根据 StackOverflow 上的类似帖子尝试了很多东西,但没有运气。最糟糕的是,当我运行单元测试时,我没有在本地收到此错误。只有当我对使用另一个数据库的 TeamCity 运行它时才会发生这种情况。它仍然是 MariaDB,是的,该表确实存在于该数据库中,所以不,这不是问题。

我确信这是遗留 HBM xml 文件中的一个小配置问题。老实说,我不能等到我们去适当的注释类。与此同时,必须有一个简单的解决方案来解决这个问题。

【问题讨论】:

    标签: java mariadb hibernate-5.x


    【解决方案1】:

    好吧,我现在知道发生了什么,这与 Hibernate 5 和数据库表名中的一些疯狂有关。数据库中的实际表名是:commTemplateInfos。

    当我针对本地数据库 (MariaDB) 在本地运行单元测试时,表名不区分大小写。然而,我们 TC 使用的数据库 IS 非常区分大小写,因此根本找不到表。

    解决方案很简单,将表格重命名为:comm_template_info 因此,我们用下划线 (_) 隔开,但也将其设为单数以匹配所有其他表名。一旦我们这样做了,我们的 hbm.xml 文件就会更改为匹配这个确切的表名,我们的问题就消失了。

    我希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-08-06
      • 1970-01-01
      • 2017-01-09
      • 2018-11-12
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      相关资源
      最近更新 更多