Notre application Java a environ 100 classes mappées à une base de données (SQL Server ou MySQL). Nous utilisons Hibernate comme ORM (avec des fichiers de mapping XML).Hibernate cache de second niveau et ON DELETE CASCADE dans le schéma de base de données
Nous spécifions FOREIGN KEY
contraintes dans notre schéma de base de données. La plupart de nos contraintes FOREIGN KEY
spécifient également ON DELETE CASCADE
.
Nous avons récemment commencé à activer la mise en mémoire cache de second niveau Hibernate (pour les entités et collections populaires) afin d'atténuer certains problèmes de performances.
Les performances se sont améliorées depuis que nous avons activé le cache de deuxième niveau. Cependant, nous avons également commencé à rencontrer ObjectNotFoundExceptions.
Il semble que les ObjectNotFoundExceptions sont INTERVENUES parce que la base de données supprime les lignes de table sous Mise en veille prolongée. Par exemple, lorsque nous supprimons un Parent
avec Hibernate, le schéma de la base de données ON DELETE CASCADE
vers toutes les entités Child
. Cela se produit évidemment sans connaissance Hibernates, donc il n'a pas l'occasion de mettre à jour le cache de second niveau (et de supprimer toutes les entités Child
).
Nous croyons que la solution à ce problème est d'enlever ON DELETE CASCADE
de notre schéma de base de données (mais gardez le s). Au lieu de cela, nous devons configurer Hibernate pour supprimer les dépendances Child
avec le SQL normal de suppression qui fera également mettre à jour Hibernate le cache de 2ème niveau. Des tests limités ont montré que cette approche semble fonctionner.
Je voulais obtenir des commentaires de la communauté à ce sujet. Existe-t-il des solutions alternatives (meilleures?) À notre problème? Comment les autres gèrent-ils cette situation? En général, quels sont les compromis à prendre en compte lors de l'utilisation de ON DELETE CASCADE
dans un schéma de base de données avec Hibernate?
Merci.
Bon point. La base de données n'est accessible et mise à jour que par le code Java dans notre application. Cette situation est peu susceptible de changer. Ainsi, supprimer les CASCADE ON DELETE n'affecterait PAS les autres applications/scripts/etc. –
Alors allez-y et faites-le via Hibernate – bwawok
Pourquoi ne pas laisser la base de données 'ON DELETE CASCADE' en combinaison avec Hibernate Delete Cascade? base de données le supprime, Hibernate essaie de supprimer l'enfant en cascade mais rien à supprimer. Donc, rien ne devrait arriver ou ai-je tort? – djmj