アンダースコアにデータベースフィールドがあります。ラクダにエンティティフィールドがあります。どちらも変更できません。
何かありますか、多分クラスレベルの注釈を使用して、エンティティ列名の注釈をデフォルトのキャメルケースに対応させることができますか?
たとえば、次のようなエンティティがあります。
@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;
}
Hibernateの命名戦略を使用できます。このような命名戦略クラスは、指定されたJava名のデータベース名を生成する方法を説明します。
見る:
非常に優れたOracle命名戦略 -ラクダをアンダースコア規則に変換します。
この記事 で説明したように、カスタムHibernateネーミング戦略を使用してこれを実現できます。
必要なことは、hibernate-types
オープンソースプロジェクトを使用することだけです。
次の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"
/>
次の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"
/>
次の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"
/>
次の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)
)
いいですね
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
}
}
必要に応じて命名戦略を選択してください。
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;
}