2017-01-28 9 views
7

これは私を怒らせる。スプリングブートハイバーネーション5 @テーブルと@カラムを無視する

私はSpring Socialを実装しています。(アンダースコアを使用して2つの単語を区切るという標準命名規則の代わりに)UserConnectionという名前のデータベーステーブルが必要です。

私の素朴な世界観では、@Table(name="UserConnection")を指定することで簡単に解決できると思っていましたが、そう簡単ではありません。

注釈は無視され、表はuser_connectionとして作成され、Spring Socialにヒスイフィットが適用されます。

私のSpring Bootアプリケーションに、標準のものの代わりにラクダのケース命名規則を使用するように1つのテーブル(とそれに対応するカラム)の名前を付ける簡単な方法があることを教えてください。

+0

どのようにあなたがあなたの自動車のDDLの作成を設定しますこれはあなたのケースでは最後の手段ですが? –

+0

は、あなたがsession.activityに追加するapplication.propertiesとproertiesを追加すると良いでしょう –

答えて

5

TL; DR

あなたapplication.ymlファイルに次の行を追加します

spring: 
    jpa: 
    hibernate: 
     naming: 
     physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

またはあなたのapplication.properties

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

詳細な回答

春ブーツとして1.4 release notes状態:

SpringNamingStrategyは、Hibernate 5.1が古いNamingStrategyインターフェイスのために サポートを削除したために使用されなくなりました。新しい SpringPhysicalNamingStrategyが自動設定され、これは とHibernateのデフォルトのImplicitNamingStrategyの組み合わせで使用されます。この は、Springブート1.3 のデフォルト値に非常に近くなければなりませんが、アップグレード時にデータベーススキーマが正しく であることを確認する必要があります。

この新しいPhysicalNamingStrategyは、Springで推奨される命名規則に従います。とにかく、物理的な名前付けを完全に制御したい場合は、org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImplを使用する方がよいでしょう。あなたのapplication.ymlに以下を加えることにより、そのネーミング戦略に切り替えることができます

spring: 
    jpa: 
    hibernate: 
     naming: 
     physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

注釈は無視され、テーブルは、その後hissyのフィット感を持つように春社会を起こしuser_connection として作成されます。

private Identifier apply(Identifier name, JdbcEnvironment jdbcEnvironment) { 
    if (name == null) { 
     return null; 
    } 
    StringBuilder builder = new StringBuilder(name.getText().replace('.', '_')); 
    for (int i = 1; i < builder.length() - 1; i++) { 
     if (isUnderscoreRequired(builder.charAt(i - 1), builder.charAt(i), 
       builder.charAt(i + 1))) { 
      builder.insert(i++, '_'); 
     } 
    } 
    return getIdentifier(builder.toString(), name.isQuoted(), jdbcEnvironment); 
} 

private boolean isUnderscoreRequired(char before, char current, char after) { 
    return Character.isLowerCase(before) && Character.isUpperCase(current) 
      && Character.isLowerCase(after); 
} 

それは基本的にアンダースコアを持つ任意の.とケースの変更(isUnderscoreRequired方法を見てみましょう)に置き換えます。

SpringPhysicalNamingStrategyapply方法は、この動作を理解するための鍵です。

+0

私はたくさんのことを試みました。このメソッドを使用すると、アンダースコアを使用して明示的にマップされていない他のすべてのテーブルと列が、ラクダのケースを使用して再作成されたと考えられます。だから本質的に、私がこのアプローチを使用する場合、私はすべての単一の列とテーブルを通過し、アンダースコア表記でそれらをオーバーライドする注釈を追加する必要があります。 – Trevor

+0

ええ、私はちょうどそれをテストし、上記のように動作します。 @Columnと@Tableで明示的に指定されていないすべてのテーブルとカラムは、ラクダのケースとしてDBに作成されます。私は正反対の効果が欲しいので、それは吸う。私はこの愚かな 'UserConnection'テーブルを明示的にマッピングするだけで、他のすべてのテーブルとカラムをマッピングする必要はありません。 – Trevor

+0

@Trevorそれでは、あなた自身の 'ImplicitNamingStrategy'を提供してください。 –

0

オプション1

まず第一には、@Entityマッピングに自分のテーブル名を定義します。

@Entity(name = "UserConnections") 
public class UserConnection{ 

オプション2

あなたはNamingStrategyをしてビットを払う必要があります。これを追加してみてください、その後のSessionFactory豆のためにあなたのプロパティを定義する場合:エンティティは明示的 マップがすることをデータベーステーブルに名前を付けていない場合は

<prop key="hibernate.implicit_naming_strategy">legacy-jpa</prop> 

、我々は暗黙のうちにそのテーブル名を決定する必要があります。または、特定の属性が にマップされているデータベース列に明示的に名前を付けていない場合は、その列名を暗黙的に判断する必要があります。

このように、各エンティティのテーブル名を明示的に指定しない場合は、この戦略に従う必要があります。上記は、あなたのために動作しない場合は3

オプションはまた、あなたはPhysicalNamingStrategyを使用する必要があります。

参照:https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/naming.html

関連する問題