web-dev-qa-db-ja.com

camelCaseを使用してHibernateエンティティフィールドをsnake_case(アンダースコア)データベース識別子にマップする方法

アンダースコアにデータベースフィールドがあります。ラクダにエンティティフィールドがあります。どちらも変更できません。

何かありますか、多分クラスレベルの注釈を使用して、エンティティ列名の注釈をデフォルトのキャメルケースに対応させることができますか?

たとえば、次のようなエンティティがあります。

@Entity
public class AuthorisationEntity {

    @Column(name = "non_recoverable")
    private BigDecimal nonRecoverable;

    @Column(name = "supplier_recoverable")
    private BigDecimal supplierRecoverable;

    @Column(name = "refund_amount")
    private BigDecimal refundAmount;

}

私はこれを夢見ています:

@Entity
@DatabaseIsUnderscoreAndThisAnnotationConvertsThemToCamelCaseByDefault
public class AuthorisationEntity {

    private BigDecimal nonRecoverable;

    private BigDecimal supplierRecoverable;

    private BigDecimal refundAmount;

}
27
Paul Stanley

Hibernateの命名戦略を使用できます。このような命名戦略クラスは、指定されたJava名のデータベース名を生成する方法を説明します。

見る:

命名戦略の例

2番目の例

非常に優れたOracle命名戦略 -ラクダをアンダースコア規則に変換します。

13
przemek hertel

この記事 で説明したように、カスタムHibernateネーミング戦略を使用してこれを実現できます。

必要なことは、hibernate-typesオープンソースプロジェクトを使用することだけです。

Hibernate 5.2以降

次のMaven依存関係を追加する必要があります。

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

そして、次のHibernate構成プロパティを設定します。

<property name="hibernate.physical_naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

Hibernate 5.0および5.1

次のMaven依存関係を追加する必要があります。

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-5</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

そして、次のHibernate構成プロパティを設定します。

<property name="hibernate.physical_naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

Hibernate 4.3

次のMaven依存関係を追加する必要があります。

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-43</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

そして、次のHibernate構成プロパティを設定します。

<property name="hibernate.ejb.naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

Hibernate 4.2および4.1

次のMaven依存関係を追加する必要があります。

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-4</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

そして、次のHibernate構成プロパティを設定します。

<property name="hibernate.ejb.naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

試験時間

次のエンティティがあると仮定します。

@Entity(name = "BookAuthor")
public class BookAuthor {

    @Id
    private Long id;

    private String firstName;

    private String lastName;

    //Getters and setters omitted for brevity
}

@Entity(name = "PaperBackBook")
public class PaperBackBook {

    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE
    )
    private Long id;

    @NaturalId
    private String ISBN;

    private String title;

    private LocalDate publishedOn;

    @ManyToOne(fetch = FetchType.LAZY)
    private BookAuthor publishedBy;

    //Getters and setters omitted for brevity
}

CamelCaseToSnakeCaseNamingStrategyカスタム命名戦略を使用する場合、Hibernateはhbm2ddlツールを使用して次のデータベーススキーマを生成します。

CREATE SEQUENCE hibernate_sequence
START WITH 1 INCREMENT BY 1

CREATE TABLE book_author (
    id          BIGINT NOT NULL,
    first_name  VARCHAR(255),
    last_name   VARCHAR(255),
    PRIMARY KEY (id)
)

CREATE TABLE paper_back_book (
    id              BIGINT NOT NULL,
    isbn            VARCHAR(255),
    published_on    DATE, 
    title           VARCHAR(255),
    published_by_id BIGINT, 
    PRIMARY KEY (id)
)

いいですね

7
Vlad Mihalcea
import org.hibernate.cfg.DefaultNamingStrategy;
import org.hibernate.cfg.ImprovedNamingStrategy;

public class NamingStratagyTest {
    public static void main(String[] args) {
        String colName = DefaultNamingStrategy.INSTANCE.columnName("UserName");
        System.out.println(colName); // UserName
        colName = ImprovedNamingStrategy.INSTANCE.columnName("UserName");
        System.out.println(colName);// user_name
    }
}

必要に応じて命名戦略を選択してください。

1
zawhtut

Springブートアプリケーションでも同じ問題が発生していました。上記のHibernate構成をスプリングプロパティファイルに追加しようとしましたが、成功しませんでした。Java Beanとして追加しました。

私はHibernate Propertiesオブジェクトを使用しています。これにhibernate構成を追加すると問題が解決しました。

        protected Properties buildHibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName());
        hibernateProperties.setProperty("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName());

        return hibernateProperties;
    }
0
Leroy