web-dev-qa-db-ja.com

Hibernateを使用した大文字の名前を持つTABLEのSpringブートJPA挿入

私は次のようにマップされたテーブルエンティティを持っています:

@Entity
public class ItemsToRegister implements Serializable{

@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....

データベースに新しいレコードを挿入しようとすると、テーブル名は小文字でitems_to_registerに変換されますが、テーブル名はITEMS_TO_REGISTERになります。 (my.cnf)

私はapplication.propertiesファイルにあります:

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
37
carlj

ハイバネート5では、

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

application.propertiesファイル内。

87
jasonleakey

追加するソリューション:

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.EJB3NamingStrategy

application.propertiesへ:)

うん!!!

10
carlj

@jasonleakeyが示唆したように、以下のような命名戦略の使用を検討できます。

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

これは、@ Table(name = "")または@Column(name = "")で指定されたとおりにSQLを生成するようにHibernateに指示します。すべて順調です。

ただし、覚えておいてください-エンティティクラスで@ Table、@ ColumnアノテーションなしでPhysicalNamingStrategyを使用している間、hibernateはクラス名と変数名を使用してSQLを生成します。以下を考慮してくださいJava class

Class Employee {
   private String firstName;
   private String lastName; 
}

生成されたSQLは次のようになります

select employee0_.firstName,employee0_lastName from Employee employee0_;

残念ながら、これはDBの列をFIRST_NAMEおよびLAST_NAMEとして定義し、テーブル名をEMPLOYEEとして定義するので、これは素晴らしい選択ではありません。 PhysicalNamingStrategyを使用していなかった場合、SQLは

select employee0_.first_name,employee0_last_name from employee employee0_;

そのため、実際には以下の2つのオプションから選択できます。

  • PhysicalStrategyを使用して、すべてのテーブル名/列名を@Tableおよび@Column注釈付きのJavaコードで明示的に定義します。
    または
  • Dbで小文字のテーブル名を定義し、hibernateが自動的にテーブル名/列名を生成するようにします。
7
SekharKari

大文字と小文字を区別するには、tics( `)でテーブル名をエスケープする必要があります。

@Table(name = "`ITEMS_TO_REGISTER`")
6
John Thompson

独自の戦略を実装し、application.propertiesから呼び出すことができます。

spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy

常に最初の文字を大文字にする例

import Java.io.Serializable;
import org.Apache.commons.lang3.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 CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable {
    /**
     * Singleton access
     */
    public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy();

    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    private Identifier capitalize(Identifier name) {
        if (name == null)
            return null;
        if (name.isQuoted())
            return name;
        String text = StringUtils.capitalize(name.getText());
        return Identifier.toIdentifier(text);
    }
}
2
mjassani

あなたが試すことができます:

@Entity
@Table(name = "ITEMS_TO_REGISTER")
public class ItemsToRegister implements Serializable {
   ...
1
Mikk