JPA/Hibernate table de correspondance Un-à-plusieurs liens
Je suis en utilisant JPA et hibernate annotations seulement 4.0.1 que l'implémentation JPA.
J'ai unAssessment
classe qui a deux ensembles de Comment
:
@Entity
@Table(name = "ASSESSMENT")
public class Assessment{
@OneToMany(fetch = FetchType.EAGER)
private Set<Comment> auditComments = new HashSet<Comment>();
@OneToMany(fetch = FetchType.EAGER)
private Set<Comment> comments = new HashSet<Comment>();
}
(Je suis à sauter getters, setters, cascade de notes et d'autres pas pertinent de lignes de code)
Commentaire:
@Entity
@Table(name = "COMMENT")
public class Comment{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(columnDefinition = "text")
private String text;
}
Présent, parce que Comment
n'a pas de référence à Assessment
(c'est fait exprès), je ne peux pas uset la mappedBy propriété et Hibernate a besoin de créer une table de correspondance entre Comment
et Assessment
. Par défaut, il est nommé ASSESSMENT_COMMENT.
Si j'avais un seul ensemble de Comment
dans Assessment
, qui fonctionne parfaitement bien. Le ASSESSMENT_COMMENT aurait seulement deux colonnes:
[ASSESSMENT_ID, COMMENT_ID]
qui représentent parfaitement l'un-à-plusieurs relations.
Maintenant, voici le problème:
Parce que je n'ai pas un jeu de Comment
mais deux, Hibernate essaie de mapper les deux ensembles à l'aide de seulement un ASSESSMENT_COMMENT table. Ce tableau comporte 3 colonnes:
[ASSESSMENT_ID, COMMENT_ID, AUDITCOMMENT_ID]
En plus de cela, les 3 colonnes sont définies comme non nullable.
Qui ne peut certainement pas de travail. Par exemple, si j'ai qu'un seul élément dans auditComents et aucun dans les commentaires, hibernate essaie d'insérer une ligne avec une valeur null dans COMMENT_ID qui crée une exception SQL.
Questions:
Pour moi, il ressemble à un bug. Il devrait y avoir deux tables de mappage, pas un seul.
Donc, 1) est-ce un bug connu en veille prolongée? 2) est-il un moyen de contourner cela? Puis-je la force d'Hibernation pour créer deux tables de mappage, un pour chaque jeu. Gardez à l'esprit que je ne peux pas changer le Comment
classe d'avoir une référence à Assessment
(logique)
OriginalL'auteur phoenix7360 | 2012-12-14
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous pouvez utiliser deux colonnes dans le commentaire de la table de point de retour à leur évaluation:
Si vous voulez deux tables de jointure, le juste dire:
Qui est bien sûr expliqué dans la documentation.
Comment le Commentaire de la classe de regarder si vous voulez avoir une relation bidirectionnelle? E. g. dans le Commentaire POJO je voudrais avoir une référence à une Évaluation? Vous ne pouvez pas utiliser deux @jointable (l'un contre chaque table de correspondance de la société mère)? Comment le feriez-vous?
Si les associations ont été bidirectionnelle, vous auriez à faire des Commentaires au propriétaire du côté des associations. En Commentaire, vous avez un champ
commentedAssessment
et un champauditedAssessment
. Ils seraient assignés à@ManyToOne
, avec une table de jointure comme ci-dessus, mais avec joinColumns et inverseJoinColumns commuté. Dans l'Évaluation, il vous suffit@OneToMany(mappedBy = "auditedAssessment") private Set<Comment> auditComments;
et@OneToMany(mappedBy = "commentedAssessment") Set<Comment> comments;
Ok, mais imaginons le cas est qu'un commentaire doit être soit un auditComment OU un commentaire, pas les deux. C'est pourquoi j'aimerais avoir les Commentaires de n'avoir qu'une référence d'Évaluation de "parent", et non pas deux références "commentedAssessment" et "auditedAssessment". Serait-ce possible d'atteindre ou dois-je besoin d'avoir deux références dont l'un sera toujours NULL? Peut-être puis-je besoin d'étendre Commentaire avec deux classes, AuditComment et NormalComment?
Oui, l'héritage semble que le droit de solution ici.
OriginalL'auteur JB Nizet