Comment modéliser un arbre avec mise en veille prolongée?
J'ai une classe appelée "Domaine". Chaque Domaine peut avoir plusieurs sous-domaines (de même type).
J'ai besoin d'être en mesure de déterminer les sous-domaines et les domaines. Les sous-domaines peuvent avoir des sous-domaines de soi-même. Cela peut être tout à fait quelques niveaux de profondeur.
Exemple:
Rootdomain
|- Subdomain 1
| |- Subdomain 2
| |
| |- Subdomain 3
|
|- Subdomain 4
| |- Subdomain 5
Comment modéliser une telle Java de la classe avec Hibernate annotations?
OriginalL'auteur Hedge | 2011-08-15
Vous devez vous connecter pour publier un commentaire.
La modélisation serait assez simple:
Noter que
parent
est la propriété responsable de l'entrée de base de données, vous devez définirparent
pour un sous-domaine pour le rapport à l'être stockées.Ce n'est pas tout à fait trivial est l'interroge, depuis SQL (et donc HQL et JPQL) n'est pas facilement prendre en charge arbre de requêtes. Hibernate peut ce faire par paresseusement le chargement du prochain niveau, mais si vous voulez charger un tas de niveaux en une seule requête, c'est là que ça devient dur.
Je ne recommande pas d'utiliser une Liste. Hibernate ne peut pas simultanément extraire plusieurs sacs (de la liste). Si vous essayez de charger 3 niveaux de cet arbre dans la même requête, vous devrez utiliser l'Ensemble de la place.
vous avez raison. À l'aide d'une liste devrait être possible avec un index.
OriginalL'auteur Thomas
Si vous souhaitez utiliser Hibernate/JPA, l'initialisation tardive (c'est le cas normal), alors vous devez pas utiliser le diagramme composite.
Hibernate problème avec le Diagramme Composite est: dans un Composite, vous avez un Composite qui a une référence à son enfant Composants.
Mais le Composant n'est qu'une classe abstraite ou une Interface, de sorte que chaque Composant est une Feuille ou un Composite.
Si vous utilisez maintenant paresseux d'initialisation pour le cild ensemble de Composite, mais alors d'une façon besoin de jeter un béton de l'enfant à la Feuille ou en Composite, vous obtiendrez un Casting d'Exception parce que hibernate utilise un proxy pour le composant ne peut pas être utilisé à la Feuille ou en Composite.
Le second inconvénient du composite motif est que chaque classe sera une Feuille ou d'un Composite, pour sa durée de vie.
C'est très bien si votre structure ne change jamais. Mais il ne fonctionnera pas si une Feuille doit devenir un Composite parce que quelqu'un veut ajouter un sous-nœud feuille.
Donc, si vous avez une certaine structure dynamique, je vous recommande un Nœud de classe qui ont une bidirectionnel plusieurs information des relations entre le parent et l'enfant nœuds.
La relation doit être bidirectionnel, si vous avez souvent besoin d'accéder à des parents ou de l'enfant dans votre code.
Le maintien de cette relation est un peu difficile, alors j'ai décidé de poster un peu plus de code.
inverse
attribut etcascade
pour permettre de sauver un arbre d'un seul coup?Digulla: Ma réponse ne couvre pas ce thème à l'heure actuelle. Donc pour le moment il ne supprime pas les enfants si vous supprimez son parent. Mais vous devriez être en mesure d'atteindre que par une cascade supprimer. Je ne pas croire que vous avez besoin de la
inverse
attribut pour la suppression.J'ai vu au moins 2 Versions de cet mais je me demande ce qui est mieux: Vous pouvez aussi ajouter la
@JoinColumn Annotation(name= "parent_id")
mais comme je l'ai indiqué ci-dessus, je n'ai aucune idée de ce que le benefites sont.Laquelle des deux versions? - est-ce une question? -- Et le
@JoinColumn
annotation n'est pas nécessaire, s'il est manquant, alors JPA applique les valeurs par défaut. (docs.jboss.org/hibernate/annotations/3.5/reference/en/html/...)OriginalL'auteur Ralph
Je vous suggère d'abord que le Java-seulement OO modèle à droite et ensuite à vous soucier Hibernate annotations que vous utilisez. Si vous trouvez que vous avez besoin pour légitimement modifier votre modèle pour Hibernate, vous pouvez toujours le faire.
En fin de compte, ce type de problème est généralement résolu avec une certaine variation de la Diagramme Composite (ne vous focalisez pas trop sur le modèle de chose, juste sur la structure et l'idée derrière elle.)
À l'aide de bases de données relationnelles lingo (plutôt détendu):
A. Si vos domaines (racine domaines et sous-domaines) sont relations (collections de n-tuples dans une table avec pas de doublons et avec un résultat clé primaire) et
B. vos domaines et sous-domaines ont une structure similaire, puis
C. Vous pourriez être en mesure de stocker toutes dans le même tableau, par la définition d'un "parent" clé étrangère telle que le parent FK d'un n-uplet de cartes à la clé primaire d'une autre.
Plus important encore, cette relation récursive doit être acyclique. La façon dont vous aller à ce sujet est structurellement jusqu'à votre problème de domaine (vous avez un domaine racine, ou vous pouvez avoir plusieurs, sans rapport avec les domaines racines?) Un domaine racine peut être denotated par avoir une valeur NULL parent de clé étrangère, ou avec une condition où un domaine racine n-uplet parent de la clé étrangère est égale à sa clé primaire. L'un des deux a des avantages et des inconvénients (qui sont l'objet de généralement stupides guerres de flamme.)
La variation j'ai parlé, c'est d'avoir tous les maple leafs et les composites être du même type de béton (voir Thomas réponses pour plus de détails.) Bien sûr, une stricte (et donc naïf) l'interprétation de ce "pattern composite" signifie beaucoup de problèmes (indépendant du mode veille prolongée être dans l'image.) Et la réalité est que tous les "casher", selon les livres de la mise en œuvre de modèles permettra également de rencontrer des problèmes. Le nom de "composite" ne devrait pas susciter des visions différentes strictement feuille composite et les types, mais au lieu de choses qui peut également être composé d'autres, peut-être le type de l'équivalent de choses.
OriginalL'auteur luis.espinal
Il y a plusieurs possibilités, en fonction de la nature des opérations qu'il faut faire.
Le plus simple est de simplement avoir un parent-enfant, un-à-plusieurs association. En fonction de ce que vous devez faire, choisir le type approprié: unidirectionnel un-à-plusieurs, unidirectionnel plusieurs-à-un, ou bidirectionnelle.
Il est souvent utile d'avoir tous les nœuds d'un arbre ont une many-to-one relation avec le nœud racine. Ce qui permet de charger un arbre entier très facilement, en une seule requête.
OriginalL'auteur JB Nizet