mardi 11 février 2014

Modification de clé composés avec JPA2 (Solution)

Mise a jour d'une valeur de clé composée JPA

Après avoir cherché un peu partout, je n'ai pas trouvé de solution élégante pour modifier une valeur d'une clé composée JPA.

Problème

Soit les classes A, B, C, D qui correspondent aux tables A_ B_ C_ D_ avec les relations suivantes:

A -> mappé sur la clé primaire sur de la table A_
B -> mappé sur la clé primaire sur de la table B_
C -> mappé sur la clé primaire sur de la table C_
D -> mappé sur la clé primaire sur de la table A_ B_ C_

L'objet D a donc comme identifiant une composition des identifiant des classe A_ B_ et C_ .

Avec JPA2 si nous voulons mettre a jour la valeur de B_ sur l'objet D_ avec :
D_.setValeurB(50) par exemple

----> Cela ne fonctionnera pas.

Solution

Afin de résoudre ce problème j'ai utilisé les requêtes JPQL de mise a jour étant donné que je n'ai pas pu modifier mon mapping car supprimer la clé composé n'était pas possible a cause de mon modèle.

Voici un exemple de code qui fonctionne: 
Query query = entityManager.createQuery(
     "UPDATE D d "
       + "SET d.cleCompose.b =:valeurB "
       + "WHERE d.cleCompose.idD=:id");
   query.setParameter("id", key.getIdUniteTypeUnite());
   query.setParameter("valeurB", value.getTypeUnite().getIdType());

   query.executeUpdate();


En cas de question je suis disponible :)