首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate 5架构-验证:缺少HBM文件的表

Hibernate 5架构-验证:缺少HBM文件的表
EN

Stack Overflow用户
提问于 2021-11-10 23:00:11
回答 1查看 180关注 0票数 2

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

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

代码语言:javascript
复制
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时,会发生此错误。

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

代码语言:javascript
复制
<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中这个“列表”的定义:

代码语言:javascript
复制
<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文件中的一个小配置问题。老实说,我不能等到我们去上适当的带注释的课程。同时,必须有一个简单的解决办法来解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-22 20:03:58

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

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

解决方案非常简单,将表重命名为: comm_template_info,因此,我们使用下划线(_)进行空格,但也使其与所有其他表名匹配。一旦我们这样做了,我们的hbm.xml文件就会被修改,以匹配这个确切的表名,我们的问题就消失了。

我希望这能帮到别人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69921219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档