当前位置: 首页 > 知识库问答 >
问题:

Hibernate 4->5迁移:NamingStrategy更改,未找到表

陈鸿才
2023-03-14

我正在尝试从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;
  • 如何使此表未找到的日志消息消失
  • 如果我有明确命名的表名,它们为什么会出现
  • 他为什么不抱怨列名
  • 为什么他看起来工作正常

共有3个答案

漆雕彦
2023-03-14

通过使用最新的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)-

赵英哲
2023-03-14

从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。

邹时铭
2023-03-14

我也发现了同样的问题,但是使用了jtdsdriver。经过一些研究,我发现hibernate withSQLServerDialogue使用sp_tables存储过程来查找表声明。在该SP中,第二个参数是schema name,因此,如果它是null,则表搜索工作正常,如果它是空字符串,则不正确。

Hibernate在两种情况下将此参数设置为null

  • 如果方言方法getNameQualifierSupport()返回NameQualifierSupport。目录,但所有SQLServer方言返回null

为了解决这个问题,我决定扩展SqlServer2012Dialectend 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