休眠4 - > 5迁移:NamingStrategy更改,表未找到 [英] Hibernate 4 -> 5 migration: NamingStrategy changes, Tables not found

查看:183
本文介绍了休眠4 - > 5迁移:NamingStrategy更改,表未找到的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想做什么



我试图从WildFly 8.2.0迁移到WildFly 10.0.0,这意味着我有(并且想要)迁移从Hibernate 4.3到Hibernate 5.0。
$ b

安装程序



  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

我已阅读


  • 我已经调试过冬眠一点,我发现在

  • 通过使用最新的SQL Server JDBC驱动程序解决了这个问题。 A有一个从2012年开始的旧版本。现在我从 https://www.microsoft.com/en-us/download/details.aspx?id=11774 (sqljdbc_4.2.6420.100_enu.exe - > sqljdbc42.jar),它开始工作。我甚至可以恢复SQL用户的默认模式更改。


    What i want to do

    I'm trying to migrate from WildFly 8.2.0 to WildFly 10.0.0 which means that i have (and want) to migrate from Hibernate 4.3 to 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
    

    I have read the migration guide and i'm hit by the Naming Strategy changes. I have read many questions about this on SO, but mine seems a bit different. Hibernate complains that tables are not found:

    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
    

    When i switched to DEBUG logging i saw for example that he is binding the entity to the correct DB table:

    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}
    

    What is odd to me is that the app works. After this Table not founds it does not complain that schema is not right. The app works. Selecting, inserting, updating data works.

    I have hibernate configured through it's spring-orm abstraction:

    @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;
    }
    

    In this correspoding entity i have table names and column names named explicitly:

    @Entity
    @Table(name = "SEC_USER")
    public class User extends BaseEntity {
    
       @Column(name = "LOGIN", nullable = false, unique = true)
       private String login;
    

    Questions

    • How to make this table not found log messages disappear?
    • Why they are appearing if i have table names explicitly named?
    • Why is he not complainging about column names?
    • Why is he seemingly working correct?

    What i have tried

    • Upgrading Spring 4.1.9 to 4.2.5 which says he has support for Hibernate 5
    • Set hibernate.implicit_naming_strategy to legacy-jpa according to this
    • 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 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.

    解决方案

    Solved this by using the newest SQL Server JDBC Driver. A had an old one from 2012. Now i downloaded and used the newest JDBC 4.2 from https://www.microsoft.com/en-us/download/details.aspx?id=11774 (sqljdbc_4.2.6420.100_enu.exe -> sqljdbc42.jar) and it started working. I could even revert the default schema changes for the SQL user.

    这篇关于休眠4 - > 5迁移:NamingStrategy更改,表未找到的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆