Hibernate polymorphisme
C'est un Hibnerate polymorphisme question et un modèle de données de conception
question; ils sont intertwingled. J'ai utilisé de la mise en veille prolongée dans le passé,
et ont beaucoup aimé, mais je trouve parfois difficile de penser à
de rien, mais trivial dessins. Pas un coup sur Hibernate; juste
une observation que l'ORM, en général, peut être difficile.
Je pense que c'est une Hibernate 101 question, mais je ne suis pas sûr. Ce que je suis en train de réaliser peut-être même pas possible.
J'ai une classe abstraite de Fruits qui seront sous-classé dans Apple
et d'Orange. J'ai une classe qui représente les notes ou des commentaires
sur les Pommes et les Oranges. Une Pomme ou une Orange peut avoir de nombreuses Notes
associés avec elle, mais seulement une Pomme ou une Orange sera jamais
associé à une Note.
Ici sont des croquis des classes, où je suis pour l'instant en omettant où
l'id de l'objet de l'aller, et les propriétés de Pommes de distinguer
de Oranges. Pour le moment, je ne me sens pas fortement sur Hibernent stratégie de l'héritage que j'utilise.
abstract public class Fruit {
}
//Apples have notes written about them:
public class Apple extends Fruit {
private Set<Note> note;
...
@OneToMany(cascade = CascadeType.ALL)
public Set<Note> getNote() {
return note;
}
}
//Oranges have notes written about them:
public class Orange extends Fruit {
private Set<Note> note;
...
@OneToMany(cascade = CascadeType.ALL)
public Set<Note> getNote() {
return note;
}
}
Ici, c'est la Note de la classe actuellement mis en œuvre, dans lequel nous voyons que
il contient des champs pour les deux une Pomme et une Orange. La faille ou inelegance
dans cette conception, une seule remarque instance uniquement
l'un de Pomme ou d'Orange, et jamais les deux. Donc, si une Note est lié à
une Pomme, l'Orange, le terrain est inutile et inesthétique, et
vice-versa.
//A note about an Apple or Orange
public class Note {
private String theNote;
private Apple apple;
private Orange orange;
...
//with the usual many to one mapping
@ManyToOne
@JoinColumn(name = "apple_id")
public Apple getApple() {
return apple;
}
//with the usual many to one mapping
@ManyToOne
@JoinColumn(name = "orange_id")
public Orange getOrange() {
return orange;
}
...
}
Cependant, c'est la classe que je pense je veux à la base de mon
conception sur, mais je ne suis pas sûr de savoir comment pensez à ce sujet avec respect
à Hibernate d'annotation et de mappage de table:
//A note about a fruit:
public class Note {
private String theNote;
private Fruit fruit;
...
}
après quoi fruit sera soit une Pomme ou d'Orange instance.
Cette dernière Note de la classe, avec sa référence à un Fruit, qui détiendra une Pomme ou une Orange, même être réconcilié avec l'ORM Hibernate mapping? Si oui, quelqu'un peut-merci de parler de comment.
OriginalL'auteur ae6rt | 2009-06-11
Vous devez vous connecter pour publier un commentaire.
C'est tout à fait possible. Vous pouvez associer les notes avec l'abstrait
Fruit
classe au lieu de les répéter dans chacun des implémentations:Ét voilà!
-- Plus basé sur commentaire:
JPA propose plusieurs stratégies pour composer avec l'héritage. Le section appropriée dans le tutoriel Java EE devrait vous aider à obtenir commencé.
Fondamentalement, vos options sont:
Un autre edit:
Remarqué, c'est une mise en veille prolongée, pas une JPA question. Ne pas faire trop de différence, cependant, que les options sont les mêmes. Voici la section appropriée dans le Hibernate docs.
Jason: en Fait, il le fait, et de façon très littérale. Si vous lisez de nouveau la question, en particulier les derniers paragraphes à partir de la deuxième bloc de code, le code que je fournis est exactement ce que ae6rt demande.
-1 supprimé... pourriez-vous nous donner des précisions quant à la façon d'une Pomme est stocké dans la base de données différemment qu'une Orange?
+1: grâce, qui aide à clarifier les choses. Il ressemble à la colonne discriminante + table par table sous-classe est la façon dont je veux aller dans mon cas. trouvé ce lien pour plus d'exemples: javalobby.org/java/forums/t18300.html
J'ai essayé votre méthode, mais c'est la génération d'une erreur liée à la colonne id définies dans la superclasse. Êtes-vous prêt à m'aider? Voici le lien: stackoverflow.com/questions/25252541/...
OriginalL'auteur Henning
Ce motif est très courant en veille prolongée en fonction datalayers. Le fonctionnement interne est fortement basée sur la stratégie de l'héritage qui est utilisé.
Lors de l'utilisation d'une table par classe ou d'une table par sous-classe de l'héritage, une table pour chaque sous-classe/classe sera créée. Par exemple, dans votre cas, vous avez un tableau de Fruits et de deux tables
Apple
etOrange
, avec de clé étrangère références entre le Fruit et le Orange ou de Pomme. Lors de la demande d'un fruit (pomme ou orange) par l'ID, Hibernate jointure externe le tableau de Fruits avec de la Pomme et de table Orange. Chaque ligne sera transformé en une Pomme ou une Orange en fonction de la table dans laquelle les champs ont été récupérés.Une autre possibilité est d'utiliser les discriminateurs. Une seule table
Fruit
qui contiendra un discriminateur de domaine (ex.fruit_type
prendre des valeursapple
etorange
). En fonction de la valeur de ce champ, Hibernate va déterminer si l'objet correspondant est une Pomme ou une Orange.Dans votre cas, dans le cas de chargement impatient, quand Hibernate des charges de l'objet de Remarque, il s'empressera de récupérer le correspondant de Fruits et de remplir le fruit de terrain avec une instance de Pomme ou d'Orange en conséquence.
Dans le cas de chargement différé, le fruit champ sera un proxy de mise en œuvre, le Fruit de l'interface. Jusqu'à ce que le fruit réel de terrain est chargé que son type est indéterminé.
Espère que cela répond à certaines de vos interrogations.
OriginalL'auteur Il-Bhima