【发布时间】: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&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