Hibernate - Comment persister un nouvel élément dans une Collection sans charger l'ensemble de la Collection
J'ai une collection dans mon modèle qui contient un ensemble de "versions précédentes" de mon domaine racine de l'objet. Les versions précédentes sont donc "immuable" et nous ne voudrons jamais à les mettre à jour, et ne veulent ajouter des dernières versions à mesure qu'ils surviennent. En outre, la "versionné' objet de domaine est assez complexe et entraîne de lourdes accès de base de données à récupérer.
Quand j'ai une nouvelle version de l'un de ces objets que je veux l'enregistrer avec les autres, sans que le chargement de l'ensemble. L'Avancée FAQ a quelques conseils sur ce:
Pourquoi ne Hibernate toujours initialiser une collection lorsque je souhaite ajouter ou de supprimer un élément?
Malheureusement, les collections de l'API définit les valeurs de retour des méthodes qui ne peut être calculée par la frappe de la base de données. Il y a trois exceptions à cela: Hibernate peut ajouter à un
<bag>
,<idbag>
ou<list>
déclaré avecinverse="true"
sans initialisation de la collection; la valeur de retour doit toujours être vrai.Si vous voulez éviter de base de données supplémentaire de trafic (ie. dans critique pour les performances du code), restructurer le modèle à utiliser seulement plusieurs-à-un les associations. C'est presque toujours possible. Ensuite, utiliser des requêtes en place de la collecte d'accès.
Je suis nouveau à tout cela et je ne suis pas sûr à 100% sur la manière de restructurer le modèle à utiliser seulement plusieurs-à-un les associations. Quelqu'un peut-il me donner un exemple de me diriger vers un tutoriel afin que je puisse apprendre de quelle façon cela résout mon problème?
- Je pense que ce que j'ai vraiment besoin de 1) pour être en mesure d'utiliser un filtre hibernate' pour récupérer uniquement la tête de révision sur le chargement de la collection (sauf pour les rapports de vérification); puis 2) si cette tête est modifié par une opération (causant deux éléments dans la collection) dire hibernate juste la mise à jour du "chef" (comme n'étant pas la tête plus) et l'insertion de la nouvelle version dans la base de données. Malheureusement, si nous adoptons cette approche, Hibernate semble penser que les éléments qui ont été filtrés (révisions antérieures) ne sont plus associés avec le parent de l'ensemble. réglage immuable= "true" ne semble pas fonctionner.
- Heureux que nous pourrions les aider. Si vous avez aimé des réponses, à vous de voter pour eux (cliquez sur la petite flèche vers le haut), pour les remercier pour leur temps. Aussi, si une réponse est assez bon pour vous, si vous allez pour quelque chose d'autre, vous pouvez marquer une réponse comme étant la "accepté" un.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous avez une Liste ou d'une base de Jeu de collection et que vous ajoutez un nouvel objet dans votre collection, Hibernate va toujours frappé de la base de données car il comparer un par un objet à l'aide est égal à la mise en œuvre avant l'enregistrement ou la mise à jour - lors de l'utilisation d'un Ensemble - ou par la comparaison d'une colonne d'index lors de l'utilisation d'une Liste. Ce comportement est nécessaire en raison de la Définir et de la Liste de sémantique. À cause de cela, les performances de votre application peut diminuer de manière significative si vous avez un tas de dossiers.
Certains solution de contournement pour résoudre ce problème
1º Conversion motif à l'aide d'un encapsuled collection de sacs, plus votre choix de Définir ou de Liste exposé comme une propriété
2º Utilisation ManyToOne au lieu de OneToMany
3º Cache - lorsqu'il est appliqué à cause de, selon vos besoins, votre configuration permet d'augmenter ou de diminuer les performances de votre application. Voir ici
4° SQL contrainte - Si vous voulez une collection qui se comporte comme un Ensemble, vous pouvez utiliser SQL contrainte, qui peut être appliqué à une colonne ou d'un ensemble de colonnes. Voir ici
Set
contraintes. c'est à dire qu'il a besoin de voir si l'entité que vous ajoutez est déjà dans la collection, il doit retourner false si elle est déjà là.La manière général, je ne c'est pour définir la collection "inverse".
Qui signifie à peu près: la première définition de la 1-N association est faite à la "N" à la fin. Tf vous voulez ajouter quelque chose à la collection que vous modifiez l'objet associé à des données de détail.
Un petit exemple de XML:
puis la mise à jour se fait exclusivement à l'Adresse:
Fait. Vous ne la touche même pas la collection. Considérons en lecture seule, ce qui peut être très pratique pour des requêtes HQL avec, et de retravailler et de les afficher.
Si je comprends bien votre besoin:
Avez-vous pensé à le maintien de votre collection déconnectée?
J'ai utilisé pour créer une requête native pour ce cas, comme ci-dessous:
C'est très rapide car n'a pas besoin de charger la collection.