2017-04-12 12 views
4

現在、WebアプリケーションをWildfly 9.0.2からWildfly 10.1.0に移動しようとしているため、をHibernate 4.3.10から5.0.10に移行しようとしています。Hibernate 5のHibernate 5に準拠するNamingStrategy

Hibernateがエンティティに対して選択した名前(Postgresqlデータベースはhbm2ddlによって構築されています)を使用して、私たち自身がNamingStrategyを決して定義したことはありません。

ここで、Hibernate 5では、命名規則が変更されたと思われるため、未知の列エラーがあります。具体的には、ジョインテーブルでは、カラム名は親の代わりに真のクラスに基づいています。agentEntity_idカラムを取得する前にAgentEntityを継承するUserEntityがある場合、今度はuserEntity_idカラムになります。

persistence.xmlでは、既存の4つのHibernate ImplicitNamingStrategies(jpa、legacy-jpa、legacy-hbm、およびcomponent-path)を試してみます。それぞれが古い戦略とは異なります。

私の古いモデルへの準拠を維持するための独自の戦略を書き直すことを避ける方法はありますか?

答えて

1

Oracleのバックエンドがありますが、この同じ問題がHibernate 5に移行しました。私は、org.hibernate.boot.model.naming.ImplicitNamingStrategyorg.hibernate.boot.model.naming.PhysicalNamingStrategyの両方を利用して、Hibernate 4と同じ名前付け戦略を達成することができました。ここで

は私のBean定義は、私のアプリケーションコンテキストから次のようになります。

@Bean 
@Primary 
public static JpaProperties jpaProperties() { 
    final Map<String, String> hibernateConfig = newHashMap(); 
    hibernateConfig.put("hibernate.implicit_naming_strategy",  
    "org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl"); 
    hibernateConfig.put("hibernate.physical_naming_strategy", 
    "com.anyapp.CustomNamingStrategy"); 

    final JpaProperties jpaProperties = new JpaProperties(); 
    jpaProperties.setProperties(hibernateConfig); 
    jpaProperties.setDatabase(ORACLE); 
    jpaProperties.setDatabasePlatform(ORACLE12C_DIALECT); 
    jpaProperties.setGenerateDdl(false); 
    jpaProperties.setShowSql(false); 
    return jpaProperties; 
} 

最も厄介な部分がどのように適用するための戦略を命名し、私はCustomNamingStrategy上を実装しなければならなかったという事実かを調べることでしたHibernateは従来のImprovedNamingStrategyの命名に一致するPhysicalNamingStrategyを提供していないので、自分自身です。ここで

は私CustomNamingStrategyの内容は以下のとおりです。

package com.anyapp; 

import org.apache.commons.lang.StringUtils; 
import org.hibernate.boot.model.naming.Identifier; 
import org.hibernate.boot.model.naming.PhysicalNamingStrategy; 
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; 

public class CustomNamingStrategy implements PhysicalNamingStrategy { 

    @Override 
    public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnv) { 
     return convert(identifier); 
    } 

    @Override 
    public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnv) { 
     return convert(identifier); 
    } 

    @Override 
    public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnv) { 
     return convert(identifier); 
    } 

    @Override 
    public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnv) { 
     return convert(identifier); 
    } 

    @Override 
    public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnv) { 
     return convert(identifier); 
    } 

    private Identifier convert(Identifier identifier) { 
     if (identifier == null || StringUtils.isBlank(identifier.getText())) { 
      return identifier; 
     } 

     String regex = "([a-z])([A-Z])"; 
     String replacement = "$1_$2"; 
     String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase(); 
     return Identifier.toIdentifier(newName); 
    } 
} 

あなたはあなたの正確なニーズに合うように正規表現を調整する必要があるかもしれませんが、これは私のために働いていたものです。

+0

私は同意しました.Hibernateには、従来のものに準拠した物理的な命名戦略はありません。あなたはcom.anyapp.CustomNamingStrategyを共有したいですか? –

+1

CustomNamingStrategy実装の内容を自分の答えに追加しました – lax1089

関連する問題