Spring Data JPAでは、スキーマと名前を指定できる@Table
アノテーションを使用して、エンティティを特定のテーブルにマップできます。
ただし、Spring Data JDBCはNamingStrategy
を使用して、エンティティークラス名を変換することにより、エンティティーをテーブル名にマップします。たとえば、MetricValue
という名前のエンティティクラスがある場合、テーブルはデフォルトスキーマでmetricvalue
という名前になります。しかし、MetricValue
スキーマのmetric_value
テーブルにapp
をマップする必要があります。
このマッピングを注釈または他の方法でオーバーライドする方法はありますか?
命名動作は、インターフェースのデフォルト実装NamingStrategy
によって定義されます
参照ドキュメント、バージョン1.0.2のセクション4.4. から:
Spring Data JDBCが提供するCrudRepositoryの標準実装を使用すると、特定のテーブル構造が期待されます。アプリケーションコンテキストでNamingStrategyを提供することで、これを調整できます。
デフォルトの実装には 次の動作(javadocバージョン1.0.2以降) があります。
デフォルトはスキーマなしで、クラスに基づくテーブル名とRelationalPersistentPropertyに基づく列名で、両方の名前部分が「_」で区切られています。
したがって、NamingStrategy
を実装するBeanを作成して、アプリケーションコンテキストに登録します。
これは@keddokコメントの例です。
@Configuration
@EnableJdbcRepositories
public class MetricStoreRepositoryConfig extends JdbcConfiguration {
@Autowired
private DataSource dataSource;
@Bean
NamedParameterJdbcOperations operations() {
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource);
}
@Bean
NamingStrategy namingStrategy() {
return new NamingStrategy() {
@Override
public String getSchema() {
return "metric";
}
};
}
}
Spring Data JDBCには、独自の@Table
アノテーション と @Column
のアノテーションがあります。
エンティティに注釈を追加し、名前を注釈の値として指定するだけです。
いくつかの例を挙げます:
@Table("entity")
class MyEntity {
private @Column("last_name") String name;
@Column(value = "entity_id", keyColumn = "entity_index")
private List<SomeOtherEntity> someList;
}
これにより、デフォルトのmy_entity
ではなく、MyEntity
がテーブルentity
に読み書きされます。属性name
は列last_name
に格納されます。そして、some_other_entity
からentity
への逆参照用の列は、通常entity
(参照されるテーブルのテーブル名)である外部キー列のentity_id
という名前になります。 )。また、リストインデックスはデフォルトのentity_index
ではなくentity_key
に保存されます。
私は ドキュメントを改善するための問題 を作成しました。