web-dev-qa-db-fra.com

Comment mapper une entité à une table dans Spring Data JDBC?

Dans Spring Data JPA, nous pouvons mapper une entité à une table spécifique en utilisant @Table annotation où nous pouvons spécifier le schéma et le nom.

Mais Spring Data JDBC utilise un NamingStrategy pour mapper une entité sur un nom de table en convertissant le nom de classe des entités. Par exemple, si nous avons la classe d'entité nommée MetricValue, la table doit être nommée metricvalue dans le schéma par défaut. Mais je dois mapper MetricValue au metric_value table dans le schéma app.

Existe-t-il un moyen de remplacer ce mappage par une annotation ou tout autre?

7
keddok

Le comportement de nommage est défini par l'implémentation par défaut de l'interface NamingStrategy

De documentation de référence, section 4.4.3 de la version 1.0.2 :

Lorsque vous utilisez les implémentations standard de CrudRepository fournies par Spring Data JDBC, ils attendent une certaine structure de table. Vous pouvez modifier cela en fournissant une stratégie de dénomination dans le contexte de votre application.

L'implémentation par défaut a le comportement suivant (à partir de la version 1.0.2 de javadoc) :

Par défaut, aucun schéma, nom de table basé sur Class et nom de colonne basé sur RelationalPersistentProperty avec les parties de nom des deux séparées par '_'.

Créez donc un bean qui implémente NamingStrategy en l'enregistrant dans votre contexte d'application.

Voici un exemple du commentaire @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 a son propre @Table annotation et aussi un @Column un.

Vous ajoutez simplement l'annotation à votre entité et spécifiez le nom comme valeur de l'annotation.

Pour donner quelques exemples:

@Table("entity") 
class MyEntity {

    private @Column("last_name") String name;

    @Column(value = "entity_id", keyColumn = "entity_index") 
    private List<SomeOtherEntity> someList;
}

Cela va lire et écrire MyEntity dans/depuis la table entity au lieu de la valeur par défaut my_entity. L'attribut name sera stocké dans la colonne last_name. Et les colonnes de référence arrière du some_other_entity à entity sera nommé entity_id pour la colonne de clé étrangère qui serait normalement entity (le nom de la table référencée). Et l'index de la liste sera stocké dans entity_index au lieu de la valeur par défaut entity_key.

J'ai créé n problème pour améliorer la documentation .

5
Jens Schauder