2016-03-10 8 views
7

私は私が持っている(としたい)ことを意味しているWildFly 8.2.0からWildFly 10.0.0に移行しようとしている

をやりたいですHibernate 4.3からHibernate 5.0に移行します。Hibernateは4 - > 5移行:NamingStrategyを変更、テーブルが見つからない

セットアップ

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 

私はmigration guideを読んでいると私は命名戦略変化に見舞われています。私はhave​​manyquestionsこれについては約これだが、私のものは少し違うようだ。

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} 

私には奇妙されているもの:

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テーブルにエンティティを結合していることは、たとえば見たデバッグログに切り替えた場合:Hibernateはテーブルが見つからないと文句を言いアプリが動作すること。このTable not foundの後、スキーマが正しくないと不平を言うことはありません。アプリは動作します。データの選択、挿入、更新は機能します。

このcorrespodingエンティティで
@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; 
} 

私はテーブル名と列名が明示的に指定している:私は休止状態それを構成している

は、ばねORM抽象化だ

@Entity 
@Table(name = "SEC_USER") 
public class User extends BaseEntity { 

    @Column(name = "LOGIN", nullable = false, unique = true) 
    private String login; 

質問

  • このテーブルにログメッセージが表示されないようにするには?
  • テーブル名に明示的に名前が付けられているのはなぜですか?
  • なぜ彼はカラム名について納得していませんか?
  • なぜ彼はが一見正しく働いていますか?私はthis
  • セットに従ってsays he has support for Hibernate 5

  • 設定hibernate.implicit_naming_strategyにレガシーJPAた4.2.5に
    • アップグレード春4.1.9を試してみました何

    手動でデフォルトのスキーマを作成し、db_ownerロールを割り当てました。私は休止状態4.私は少しと私はカタログ(これは何でも)とスキーマを見ていない休止状態InformationExtractorJdbcDatabaseMetaDataImpl.javaで見つかっ休止デバッグしている enter image description here

  • で前にこれをしなければならなかったことはありません注意してください。私は彼がスキーマを見なければならないと思う。以下のスクリーンショットを参照してください。カタログとスキーマはnullです。休止5のよう

    enter image description here

答えて

0

最新のSQL Server JDBCドライバを使用してこれを解決しました。 Aはhttps://www.microsoft.com/en-us/download/details.aspx?id=11774(sqljdbc_4.2.6420.100_enu.exe - > sqljdbc42.jar)から最新のJDBC 4.2をダウンロードして使用したところ、動作し始めました。 SQLユーザーのデフォルトのスキーマ変更を元に戻すこともできます。

+0

Hmm。それは本当に意味をなさない。あなたは同時に複数のものを試していないと確信していますか? SQLドライバのバージョンはこれとは関係ありません。 –

+0

ええ、本当に。私はスキーマに関するすべての変更を元に戻し、 'hibernate.implicit_naming_strategy'セットだけを残してから、JDBCドライバを前後に切り替えました。たぶんhttp://stackoverflow.com/users/1025118/vlad-mihalceaこのスレッドが表示され、それにコメントします:) –

0

、NamingStrategyをの論理は、二つの概念に分割される:暗黙的および物理。暗黙的な命名方法を正しく設定しましたが、物理命名規則を設定していません。上記のクラスの完全修飾クラス名にプロパティhibernate.physical_naming_strategyを設定することで、これを使用する

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()); 
    } 

} 

変更を:あなたは1を自分で作成する必要がありますのでHibernateは、互換性のあるものを提供していませんでした。

+0

。私の場合は、それはJDBCドライバだったようです。 –

5

私は同じ問題を認識していましたが、jtdsドライバを使用していました。いくつかの研究の後、私はSqlServerDialectと冬眠は、sp_tablesテーブルの宣言を見つけるためにストアドプロシージャを使用して設立されました。そのSPの2番目のパラメータがスキーマ名なので、nullの場合、テーブル検索は正しく動作し、空の文字列ではない - そうではありません。

Hibernateは2つの場合にnullこのパラメータを設定します

  • 場合NameQualifierSupport.CATALOGを返すが、すべてSqlServerDialectsが
  • nullを返すgetNameQualifierSupport()方言方法であればドライバretursでfalse 'supportsSchemasInTableDefinitions()' メソッドが、jtds戻りますtrue

これを解決するために、SqlServer2012DialectエンドオーバーライドgetNameQualifierSupport()メソッドを拡張することにしました。このことができます

public class SqlServer2012DialectWithCatalogOnly extends SQLServer2012Dialect { 
    @Override 
    public NameQualifierSupport getNameQualifierSupport() { 
     return NameQualifierSupport.CATALOG; 
    } 
} 

と設定プロパティhibernate.dialect

org.company.SqlServer2012DialectWithCatalogOnly新しいクラスへの希望...

0

私はあなたがすべてを知って興味があると思い、私は次のチケットログインしました:

https://hibernate.atlassian.net/browse/HHH-11424

JTDSをMicrosoft JDBCドライバに更新すると、を実装するドライバが提供されます明らかに、と報告されています。

ただし、そのドライバを更新してdefault_schemaを有効に変更して場所テーブルを参照すると(たとえば、現在のユーザーのデフォルトの 'dbo'スキーマを参照しないように)、カスタマイズされたSchemaNameResolverを提供せずにまだ運が悪いです。

このすべての本当の面倒な点は、暗黙のスキーマ名が検証中に絶対に適用されないことです。

0

私は同様の問題を持っていたし、私はこの方法で解決:私はこれを確認したが、それはそれではない

jpaProperties.put("hibernate.hbm2ddl.jdbc_metadata_extraction_strategy", "individually")