Mise en veille prolongée cache de second niveau et CASCADE ON SUPPRIMER dans le schéma de base de données

StackOverflow https://stackoverflow.com/questions/3087040

Question

Application Notre Java a environ 100 classes mappées à une base de données (SQL Server ou MySQL). Nous utilisons Hibernate notre ORM (avec les fichiers de mappage XML).

Nous spécifier des contraintes de FOREIGN KEY dans notre schéma de base de données. La plupart de nos contraintes de FOREIGN KEY précisent également ON DELETE CASCADE.

Nous avons récemment commencé la mise en cache qui permet de niveau 2 Hibernate (pour les entités populaires et collections) pour atténuer certains problèmes de performance.

La performance est améliorée depuis que nous a permis au cache de niveau 2. 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 l'on supprime un Parent avec Hibernate, le schéma de base de données ON DELETE CASCADE à toutes les entités Child. Cela se produit évidemment sans connaissance et hiberne, il ne reçoit pas une chance de mettre à jour le cache de niveau 2 (et supprimer toutes les entités Child supprimés).

Nous croyons que la solution à ce problème consiste à supprimer ON DELETE CASCADE de notre schéma de base de données (mais gardez les FOREIGN KEYs). Au lieu de cela, nous devons configurer Hibernate pour les dépendances de suppression de Child avec SQL suppression normale qui sera également mise à jour de la mise en veille prolongée faire du cache de niveau 2. Certains des tests limités ont montré que cette approche semble fonctionner.

Je voulais obtenir un peu sur cette rétroaction de la communauté. Y at-il d'autres (mieux?) Des solutions à notre problème? Comment les autres gérer cette situation? En général, quels sont les compromis qui doivent être pris en compte lors de l'utilisation ON DELETE CASCADE dans un schéma de base de données avec Hibernate?

Merci.

Était-ce utile?

La solution

Si vous allez toujours supprimer votre programme, vous voulez prendre la contrainte de la base de données et dire l'objet Mise en veille prolongée sur ON CASCADE SUPPRIMER pour prendre soin des gars connexes.

Par contre, si vous allez supprimer des objets parfois dans votre application java, et parfois au niveau de votre base de données, vous allez vous retrouver avec des données de pendaison bizarre. Dans ce cas, vous devrez peut-être examiner une approche plus compliquée .. Vous n'étiez pas clair si tel était le cas, alors ne va pas aller plus en détail ici.

Autres conseils

Si vous utilisez ON DELETE CASCADE dans votre base de données que vous devez dire en veille prolongée, comme ceci:

@OnDelete(action = OnDeleteAction.CASCADE)

ceci est différent de

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

Ce dernier est dit hibenrate quelque chose au sujet de la relation en mémoire. le premier optimise supprimer des instructions SQL sur le niveau de la base de données. Hibernate a besoin de savoir que la DB prend soin de Childs suppression.

Jetez un oeil à ce site pour une bonne explication de ce mécanisme:

http://eddii.wordpress.com/2006 / 11/16 / hiberner-on-deletecascade performance /

et le commentaire du développeur de cette fonctionnalité:

http: //www.mail-archive. com/hibernate-devel@lists.sourceforge.net/msg03801.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top