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 p>
Toute aide est grandement appréciée p>
Cordialement Damien p>
4 Réponses :
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();
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.
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. P>
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.
Je pense que ce dont vous avez besoin est GÉNÉRALEKEKEYLDER.GETKEYS () . Le code ressemblerait à Cet exemple , sauf que vous devrez appeler au lieu de p>
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; } }
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.