web-dev-qa-db-ja.com

テーブル名を変更するHibernateの命名戦略

休止状態(バージョン5.1)の命名戦略に少し混乱しています。つまり、テーブル名が変更されるため、それを避けたいと思います。また、_spring.jpa.hibernate.naming_strategy_はintelijに従って非推奨のようですが、正しく設定する(他の)方法が見つかりません。

Application.propertiesに次の構成があります。

_spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
spring.jpa.properties.hibernate.current_session_context_class=thread
_

前述のように、最初のものは非実践としてマークされます。

これでエンティティができました:

_@Entity
@Table(name = "usaUploadTable", schema = "usertable201", catalog = "")
public class UsaUploadTable {
    ....
}
_

テーブル名は、@Table(name = "") usaUploadTableのようになります。

アプリケーションを実行すると、

テーブル 'usertable201.usa_upload_table'は存在しません

どちらが正しいか-休止状態がどのように変更しているかという名前は付けられていません。

休止状態でテーブル名を正しく使用するにはどうすればよいですか?

編集:

私も試しました

_DefaultNamingStrategy
ImprovedNamingStrategy
_

それらのすべてがそれを変える

バージョン:

_spring-boot-1.4.0.RELEASE
hibernate 5.1
javax-transaction-api 1.2
hibernate-validator 5.2.4
javassist 3.20
_
10
J.Doe

問題はspring-boot-1.4にあります-プロパティ(または何でも)を変更したようです私は今この答えを見つけました ImprovedNamingStrategyはHibernate 5で動作していません 、それでもまだ正しく解決します。そのため、アンダースコアメソッドを使用せず、新しく導入されたクラスSpringPhysicalNamingStrategyを拡張するために、コードを少し変更しました。

package com.foo;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

import Java.io.Serializable;
import Java.util.Locale;


public class RealNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

}

application.properties廃止予定の行を次のように変更しました

spring.jpa.properties.hibernate.physical_naming_strategy=<package>.RealNamingStrategyImpl

現在、エンティティファイルにあるテーブル名と列名をそのまま使用しています。

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

それは私のために働いた。私が使用しているバージョンは次のとおりです。

Spring Boot (v1.4.2.RELEASE)
Hibernate Core {5.0.11.Final}
9
rsinha

PostgresqlおよびSpringブート1.5.2で大文字にしたい人向け

public class CustomDatabaseIdentifierNamingStrategy extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

    public static final long serialVersionUID = 1L;
    public static final CustomDatabaseIdentifierNamingStrategy INSTANCE = new CustomDatabaseIdentifierNamingStrategy();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText().toUpperCase(), true);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText().toUpperCase(), true);
    }

}
1
Bằng Rikimaru

エンティティクラスで@Tableおよび@Columnアノテーションをアンダースコアで指定された名前(つまり、user_id i.e. @Column(name = "ser_id"))で提供している場合、列名はuser_idとして使用されます。 useridとして指定すると、戦略または暗黙的戦略(具体的にはspring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl)を使用しない場合、user_idに変更されます。そのため、エンティティ属性名がアンダースコアと小文字、つまりuserIdからuser_idまでの名前に変更される戦略が必要な場合は、暗黙的またはまったく戦略を使用する必要があります(実際には暗黙的戦略を使用します)。

名前付け戦略で列名またはクラス名にアンダースコアを追加したくない場合、使用する必要がある戦略は次のようになります。spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot .model.naming.PhysicalNamingStrategyStandardImpl。アノテーション@Tableおよび@Columnのname属性で指定したものはそのまま残ります。

注釈を提供したくなく、テーブル名と列名を手動で処理したい場合は、クラスorg.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImplを拡張し、必要なメソッドをオーバーライドする必要があります。ここでいくつかのケースで注釈を使用する場合は、オーバーライドされたメソッドがそれらの注釈で記述された名前に適用されることに注意してください。 spring.jpa.hibernate.naming.physical-strategy = example.CustomStrategy

0
Raj Kundalia