我想做的事
我正在尝试从 WildFly 8.2.0 迁移到 WildFly 10.0.0,这意味着我已经(并且想要)从 Hibernate 4.3 迁移到 Hibernate 5.0。
Setup
Java 8u40
Spring 4.1.9
SQL Server 2012
Wildfly 8.2.0 -> Wildfly 10.0.0
Hibernate 4.3.6 -> Hibernate 5.0.7
我已阅读迁移指南 https://github.com/hibernate/hibernate-orm/blob/5.0/migration-guide.adoc我被击中了命名策略变化。我have https://stackoverflow.com/questions/33111949/hibernate-5-implicitnamingstrategy read https://stackoverflow.com/questions/32864327/migrating-to-hibernate-5 many https://stackoverflow.com/questions/32165694/spring-hibernate-5-naming-strategy-configuration 问题 https://stackoverflow.com/questions/32437202/improvednamingstrategy-no-longer-working-in-hibernate-5关于这个,但我的似乎有点不同。 Hibernate 抱怨找不到表:
INFO [o.h.Version] HHH000412: Hibernate Core {5.0.7.Final}
INFO [o.h.cfg.Environment] HHH000206: hibernate.properties not found
INFO [o.h.cfg.Environment] HHH000021: Bytecode provider name : javassist
INFO [o.h.annotations.common.Version] HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
INFO [o.h.dialect.Dialect] HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
INFO [o.h.envers.boot.internal.EnversServiceImpl] Envers integration enabled? : true
INFO [o.h.validator.internal.util.Version] HV000001: Hibernate Validator 5.2.3.Final
INFO [o.h.tool.hbm2ddl.SchemaValidator] HHH000229: Running schema validator
INFO [o.h.t.s.e.i.InformationExtractorJdbcDatabaseMetaDataImpl] HHH000262: Table not found: SEC_AUTHORIZATION_RULES
INFO [o.h.t.s.e.i.InformationExtractorJdbcDatabaseMetaDataImpl] HHH000262: Table not found: SEC_USER
More tables not found ...
INFO [o.h.hql.internal.QueryTranslatorFactoryInitiator] (ServerService Thread Pool -- 62) HHH000397: Using ASTQueryTranslatorFactory
当我切换到调试日志记录时,我看到他正在将实体绑定到正确的数据库表:
DEBUG [o.h.c.a.EntityBinder] Bind entity com.company.user.User on table SEC_USER
DEBUG [o.h.c.Ejb3Column] Binding column: Ejb3Column{table=org.hibernate.mapping.Table(SEC_USER), mappingColumn=ID, insertable=true, updatable=true, unique=false}
对我来说奇怪的是该应用程序可以运行。在这之后Table not found
它不会抱怨模式不正确。该应用程序有效。选择、插入、更新数据有效。
我通过它的 spring-orm 抽象配置了 hibernate:
@Bean(name = "myEmf")
@DependsOn({"dataSource", "flyway"})
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[]{"com.company.**.*"});
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
em.setJpaProperties(additionalProperties());
return em;
}
private Properties additionalProperties() {
Properties propFile = propertiesFile();
properties.setProperty("hibernate.hbm2ddl.auto", "validate");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServer2012Dialect");
properties.setProperty("hibernate.show_sql", "false");
properties.setProperty("hibernate.format_sql", "true");
properties.setProperty("hibernate.id.new_generator_mappings", "false");
properties.setProperty("hibernate.use_sql_comments", "false");
properties.setProperty("hibernate.implicit_naming_strategy", "legacy-jpa");
return properties;
}
在这个对应的实体中,我有明确命名的表名和列名:
@Entity
@Table(name = "SEC_USER")
public class User extends BaseEntity {
@Column(name = "LOGIN", nullable = false, unique = true)
private String login;
问题
- 如何让这个表未找到的日志消息消失?
- 如果我有明确命名的表名,为什么它们会出现?
- 他为什么不抱怨栏名呢?
- 为什么他是看起来工作正常?
我尝试过什么
- 将 Spring 4.1.9 升级到 4.2.5说他支持 Hibernate 5 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.2.html#_data_access_improvements
- Set hibernate.implicit_naming_strategy to 遗留-jpa根据this http://in.relation.to/2015/08/05/hibernate-orm-500-cr4-release/
Set manually the default schema and assigned the role db_owner. Note i never had to do this before with hibernate 4.
I have debugged hibernate a bit and what i found in the InformationExtractorJdbcDatabaseMetaDataImpl.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/InformationExtractorJdbcDatabaseMetaDataImpl.java that hibernate does not see the catalog (whatever this is) and schema. At leat i think he should see the schema. See screenshot below: catalog and schema are null.