我正在尝试从WildFly 8.2.0迁移到WildFly 10.0.0,这意味着我已经(并且想要)从Hibernate 4.3迁移到Hibernate 5.0。
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
我已经阅读了迁移指南,我被命名策略的变化所打击。我在SO上阅读了许多关于此的问题,但我的问题似乎有点不同。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
例如,当我切换到调试日志记录时,我看到他正在将实体绑定到正确的DB表:
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 search
之后,它不会抱怨架构不正确。应用程序有效。选择、插入、更新数据有效。
我通过它的sping-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;
通过使用最新的SQL Server JDBC驱动程序解决了这个问题。A有一张2012年的旧照片。现在我下载并使用了最新的JDBC 4.2https://www.microsoft.com/en-us/download/details.aspx?id=11774(sqljdbc_4.2.6420.100_enu.exe)-
从Hibernate 5开始,NamingStrategy的逻辑被分为两个概念:隐式和物理。您已经正确设置了隐式命名策略,但尚未设置物理命名策略。Hibernate没有提供一个兼容的,所以你必须自己创建一个:
public class LegacyPhysicalNamingStrategy implements PhysicalNamingStrategy {
private final Pattern pattern = Pattern.compile("(\\p{Lower}+)(\\p{Upper}+)");
public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) {
return convert(name);
}
public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironmen) {
return convert(name);
}
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironmen) {
return convert(name);
}
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironmen) {
return convert(name);
}
public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironmen) {
return convert(name);
}
private Identifier convert(Identifier identifier) {
if (identifier == null || identifier.getText().trim().isEmpty()) {
return identifier;
}
String text = identifier.getText();
text = pattern.matcher(text).replaceAll("$1_$2").toLowerCase();
return Identifier.toIdentifier(text, identifier.isQuoted());
}
}
通过将属性hibernate.physical_naming_strategy设置为上述类的完全限定类名来更改为使用this。
我也发现了同样的问题,但是使用了jtds
driver。经过一些研究,我发现hibernate withSQLServerDialogue
使用sp_tables
存储过程来查找表声明。在该SP中,第二个参数是schema name,因此,如果它是null
,则表搜索工作正常,如果它是空字符串,则不正确。
Hibernate在两种情况下将此参数设置为null
:
getNameQualifierSupport()
返回NameQualifierSupport。目录
,但所有SQLServer方言返回null
为了解决这个问题,我决定扩展SqlServer2012Dialect
end overridegetNameQualifierSupport()
方法。
public class SqlServer2012DialectWithCatalogOnly extends SQLServer2012Dialect {
@Override
public NameQualifierSupport getNameQualifierSupport() {
return NameQualifierSupport.CATALOG;
}
}
并设置属性hibernate。方言
到新班级组织。公司SqlServer2012DialectWithCatalogOnly
希望这有帮助。。。
我部署Laravel准骨项目到Microsoft Azure,但每当我试图执行我得到的错误: [2015-06-13 14:34:05]生产。错误:异常'Symfony\Component\Debug\Exc0019\FatalErrorExc0019',消息'Class"未找到'在D:\home\site\供应商\laravel\框架\src\Illumate\数据库\Migrations\Mi
Overview Express 5.0 is still in the alpha release stage, but here is a preview of the changes that will be in the release and how to migrate your Express 4 app to Express 5. Express 5 is not very dif
SQLAlchemy变更日志和迁移指南现在集成在主文档中。 当前迁移指南 SQLAlchemy 1.4有什么新功能? SQLAlchemy 2.0概述和状态 迁移到Alchemy 更改日志 1.4变更日志 1.3换热器 1.2换热器 1.1换热器 1换热器 0.9换热器 0.8换热器 0.7换热器 0.6换热器 0.5换热器 0.4换热器 0.3换热器 0.2换热器 0.1换热器 旧的迁移指南 S
问题内容: 我正在将应用程序从Hibernate 3迁移到Hibernate5。我们使用class来获取。因此,使用对象来获取数据库表列信息,例如列大小,类型..etc。似乎在Hibernate 5 类中已弃用(已删除!)。Hibernate 5中是否有其他上课的选择?否则如何进入Hibernate 5 env? 问题答案: 当我们转向一种新的模式工具方法时,它在5.0中已被删除。Database
Hibernate 4.2/4.3(HHH-7079)中已经将标记为已弃用。从Hibernate 5开始,现在它将附带两个替换(?)接口和(HHH-7078),并最终放弃了对旧的支持。这就是为什么Spring即将推出的Hibernate5支持甚至删除了配置器并支持和。到目前为止,一切顺利。 尽管在一些文档(即不完整的working-5.0-migration-guide.md)和即将发布的Hibe
我正在使用Flyway从Clojure内部进行数据库迁移。我遇到的问题是,当我制作一个uberjar来部署我的应用程序时,Flyway找不到jar文件中的迁移。它在开发中运行良好,无需打包应用程序。我尝试了一系列不同的组合来将迁移sql文件添加到jar中。我已经解压缩了jar,所有的迁移都在那里,我不确定问题是什么。 我使用的是flyway版本2.1.1,现在我的迁移是src/db/migrati