web-dev-qa-db-ja.com

エンティティをSpring Data JDBCのテーブルにマップする方法は?

Spring Data JPAでは、スキーマと名前を指定できる@Tableアノテーションを使用して、エンティティを特定のテーブルにマップできます。

ただし、Spring Data JDBCはNamingStrategyを使用して、エンティティークラス名を変換することにより、エンティティーをテーブル名にマップします。たとえば、MetricValueという名前のエンティティクラスがある場合、テーブルはデフォルトスキーマでmetricvalueという名前になります。しかし、MetricValueスキーマのmetric_valueテーブルにappをマップする必要があります。

このマッピングを注釈または他の方法でオーバーライドする方法はありますか?

7
keddok

命名動作は、インターフェースのデフォルト実装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";
            }
        };
    }
}
3
Kartoch

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に保存されます。

私は ドキュメントを改善するための問題 を作成しました。

5
Jens Schauder