휴지 상태 5 스키마 검증: HBM 파일이 있는 테이블 누락
이 문제는 제가 예전에 겪었던 것과 매우 유사합니다.기존 비스프링 애플리케이션을 Hibernate 3.x에서 최신 5.6.0으로 변환합니다.최종(현시점)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)
따라서 이 오류는 Session Factory를 구축하려고 할 때 발생합니다.
또, 다음의 몇개의 설정도 제공할 수 있습니다.
<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>
필요한 건 다 제공한 것 같아요.Stack Overflow에 있는 비슷한 투고에 근거해 많은 시도를 했지만, 잘 되지 않았습니다.가장 나쁜 점은 유닛 테스트를 실행할 때 로컬에서 이 오류가 발생하지 않는다는 것입니다.다른 데이터베이스를 사용하는 팀시티에 대해 실행할 때만 발생합니다.이 테이블은 여전히 MariaDB이며, 실제로 해당 데이터베이스에 테이블이 존재하므로 문제가 되지 않습니다.
이것은 레거시 HBM xml 파일에서 발생한 사소한 설정 문제일 것입니다.난 솔직히 우리가 제대로 된 주석 수업을 들을 때까지 기다릴 수 없어.그 사이에, 이 문제를 해결할 수 있는 간단한 해결책이 있어야 합니다.
음, 무슨 일이 있었는지 알겠네요. 그리고 이건 Hibernate 5와 데이터베이스 테이블 이름에서의 미친 짓과 관련이 있어요.데이터베이스의 실제 테이블 이름은 commTemplateInfos였습니다.
로컬 데이터베이스(MariaDB)에 대해 장치 테스트를 로컬로 실행할 때 테이블 이름에 대소문자를 구분하지 않았습니다.그러나 TC가 IS를 사용하는 데이터베이스는 대소문자를 구분하기 때문에 테이블을 전혀 찾을 수 없습니다.
솔루션은 매우 간단합니다.테이블의 이름을 comm_template_info로 변경합니다.따라서 언더스코어(_)로 띄어쓰지만 다른 모든 테이블 이름과 일치하도록 단수화했습니다.이렇게 하면 hbm.xml 파일이 이 테이블 이름과 일치하도록 변경되어 문제가 해결되었습니다.
이게 다른 사람에게 도움이 됐으면 좋겠어요.
언급URL : https://stackoverflow.com/questions/69921219/hibernate-5-schema-validation-missing-table-with-hbm-files
'programing' 카테고리의 다른 글
MariaDB 스테이트먼트의 UNION 조항을 대체하는 방법에 대한 생각 (0) | 2023.02.04 |
---|---|
MySQL Workbench에서 Blob을 직접 표시하는 방법 (0) | 2023.02.04 |
다른 모듈의 돌연변이로 rootState에 액세스합니다. (0) | 2023.02.04 |
Chrome 송신 요청 오류:TypeError: 원형 구조를 JSON으로 변환하는 중 (0) | 2023.02.04 |
IOUtils.toString(InputStream)에 상당하는 Guava (0) | 2023.02.04 |