Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

12.4.6. Mises à jour, insertions et suppressions en bloc

Hibernate autorise l'utilisation de DML (Data Manipulation Language) pour les données d'insertions, de mises à jour et de suppressions en bloc directement dans la base de données mappée à travers par Hibernate Query Language.

Avertissement

L'utilisation de DML pourrait enfreindre le mappage objet/relationnel et affecter l'état objet. L'état objet reste en mémoire et, en utilisant DML, l'état d'un objet en mémoire ne sera pas affecté selon l'opération effectuée sur la base de données sous-jacente. Les données en mémoire doivent être utilisées avec soin si DML est utilisé.
La pseudo-syntaxe pour les déclarations UPDATE et DELETE est : ( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?.

Note

Le mot clé FROM et la clause WHERE sont optionnels.
Le résultat d'exécution d'une déclaration UPDATE ou DELETE est le nombre de lignes réellement affectées (mises à jour ou supprimées).

Exemple 12.5. Exemple de déclaration de mise à jour en bloc

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update Company set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

Exemple 12.6. Exemple de déclaration de suppression en bloc

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlDelete = "delete Company where name = :oldName";
int deletedEntities = s.createQuery( hqlDelete )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();
La valeur int renvoyée par la méthode Query.executeUpdate() indique le nombre d'entités qui se trouvent dans la base de données et qui sont affectées par l'opération.
En interne, la base de données peut utiliser plusieurs déclarations SQL pour exécuter l'opération en réponse à une mise à jour DML ou à une demande de suppression. Cela est sans doute en raison des relations existantes entre les tableaux et les tableaux de liaisons qui ont besoin d'être mis à jour ou effacés.
Ainsi et par exemple, si on émet une déclaration de suppression (exemple ci-dessus), on risque d'avoir une délétion non seulement des Company (entreprises) qui contiennent oldName dans le tableau, mais aussi dans les tableaux de liaisons. Donc, un tableau d'entreprises (Companies) qui se trouve dans une relation BiDirectionelle ManyToMany avec un tableau d'employés (Employee) perdrait des lignes dans le tableau de liaison correspondant Company_Employee suite à l'exécution de l'exemple précédent.
La valeur int deletedEntries ci-dessus contiendra le nombre de lignes affectées par cette opération, y compris les lignes qui se trouvent dans les tableaux de liaisons.
La pseudo-syntaxe pour les déclarations INSERT est : INSERT INTO EntityName properties_list select_statement.

Note

Seule la forme INSERT INTO ... SELECT ... est prise en charge; et non pas la forme INSERT INTO ... VALUES ...

Exemple 12.7. Exemple de déclaration d'insertion en bloc

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlInsert = "insert into Account (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert )
        .executeUpdate();
tx.commit();
session.close();
Si vous ne fournissez pas la valeur de l'attribut id via SELECT, un ID sera généré, tant que la base de données sous-jacente prend en charge les clés générées automatiquement. La valeur de retour de cette opération d'insertion en bloc est le nombre d'entrées créées dans la base de données.