6
votes

Spring JDBC et clés primaires composites

Y a-t-il un moyen du Spring JDBC pour renvoyer une clé primaire composite lorsqu'une ligne est insérée. Cette clé primaire composite est composée de valeurs provenant de séquences distinctes

Toute aide est grandement appréciée

Cordialement Damien


1 commentaires

Je voudrais des éclaircissements sur "Spring JDBC"; Voulez-vous dire avec des mappages hibernate ou un autre cadre JPA? Je ne suis au courant d'aucune construction dans la fonctionnalité JDBC que les offres de printemps. Une autre note: il est souvent judicieux d'utiliser une colonne de clé primaire générée lorsque les enregistrements de votre table sont uniquement identifiés par une clé composite. Surtout si cette clé de composite n'est que plusieurs colonnes générées. J'examinerais votre conception de DB pour voir si la simplification des choses facilitera l'utilisation de ces cadres.


4 Réponses :


0
votes

Voici l'idée de base pour une seule clé. L'identifiant long à la fin est la clé. Si vous avez plusieurs séquences, je recommanderais simplement d'utiliser deux instructions distinctes pour obtenir chaque clé générée.

JdbcTemplate template = getJdbcTemplate();
KeyHolder keyHolder = new GeneratedKeyHolder();
template.update(
    new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement(...);
            return ps;
        }
    },
    keyHolder);
long id = keyHolder.getKey().longValue();


2 commentaires

Les touches simples sont le cas facile et n'ont pas vraiment besoin d'explications. Les clés composites sont la question et ne semblent avoir aucune solution facile / efficace.


C'est vrai, mais je n'étais pas sûr si Damien connaissait la réponse facile. L'autre partie est que si vous insérez des données dans une table à l'aide de 2 clés générées dans une seule déclaration, cela ressemble à une faille de conception potentielle.



0
votes

Quel serveur de base de données utilisez-vous? MySQL n'autorise qu'un champ auto_incrimentation par table et j'imagine que cela est souvent le cas, mais sans connaître votre configuration, il est difficile de dire. En supposant qu'il n'y ait qu'un seul champ Auto_Génerated dans votre table, votre insert aurait dû être conscient de la valeur dans le deuxième champ PK. Le code de Robert devrait fonctionner pour récupérer la valeur de la clé générée et la solution la plus propre serait probablement d'effectuer une sélection après le fait que cette touche générée et la valeur que vous avez déjà contenue.


1 commentaires

MySQL n'est pas un bon guide pour d'autres bases de données - c'est brut et primitif. Les touches composites sont bien prises en charge par des bases de données appropriées, mais Spring JDBC ne semble pas avoir un bon soutien pour ce concept.



0
votes

Je pense que ce dont vous avez besoin est GÉNÉRALEKEKEYLDER.GETKEYS () . Le code ressemblerait à Cet exemple , sauf que vous devrez appeler xxx

au lieu de xxx


0 commentaires

4
votes

Voici un exemple complet (testé sur PostgreSQL 8.4):

My Table: P>

public void doStuff() {
    CompositeKeyHolder keyHolder = new CompositeKeyHolder();
    ... same code here ...

    keyHolder.getCompositeKey();
}


class CompositeKeyHolder extends GeneratedKeyHolder {
    private boolean converted;

    public CompositeKey getCompositeKey() {
        return new CompositeKey((Integer)this.getKeys().get("id"), (Integer)this.getKeys().get("otherid"));
    }
}


class CompositeKey {

    private Integer id;

    private Integer otherId;

    CompositeKey(Integer id, Integer otherId) {
        this.id = id;
        this.otherId = otherId;
    }

    public Integer getId() {
        return id;
    }

    public Integer getOtherId() {
        return otherId;
    }

}


0 commentaires