je les 2 entités suivantes:Comment annoter plusieurs ManyToOne à la même entité, mais un de leurs champs doit être la même
@Entity
@Table(name="user")
public class User {
@Id
@Column("id")
private long id;
@Column(name="code", nullable = false)
private String code;
@Column(name="session_id", nullable = false)
private long sessionId;
}
@Entity
@Table(name="task")
public class Task {
@Id
@Column("id", nullable = false)
private long id;
@ManyToOne(optional = false)
@JoinColumn(name="primary_user_code", referencedColumnName = "code", nullable = "false")
private User primaryUser;
@ManyToOne(optional = true)
@JoinColumn(name="secondary_user_code", referencedColumnName = "code", nullable = "true")
private User secondaryUser;
}
Le problème est que les deux objets User
à Task
doit avoir la mêmes sessionId
. Existe-t-il un moyen pour que cela soit appliqué en utilisant les annotations d'hibernation? Ou dois-je juste mordre la balle et l'appliquer dans le code?
J'ai essayé de regarder dans les @Where
et @WhereJoinTable
annotations, mais selon ce hibernate rapport de bogue, link, il n'est pas pris en charge pour @ManyToOne
Mise à jour
j'aurais probablement mentionné que User
déjà existe et il ne peut pas être changé. Ce que je contrôle est la classe Task
que j'ajoute.
Le code n'est pas unique et, associé au paramètre session_id, identifie un utilisateur unique. Le session_id
fait référence à une table distincte mais elle n'est pas annotée avec une relation @OneToOne
. C'est juste une colonne simple et la relation avec la table Session
est traitée dans le code. Essentiellement, chaque User
a un code, et lié à plusieurs Sessions
dont un seul peut être actif.
Pour la table de travail que j'ajoute, je voulais annoter si possible
Vous ne savez pas exactement ce que vous essayez d'accomplir ici, mais je pense que ce que vous avez écrit est tout à fait correct. Vous n'avez qu'à vous soucier des colonnes de clé étrangère qui sont ajoutées à votre table TASK. Pour 2 entités Utilisateur associées, vous avez 2 diff. les noms de colonnes de clés étrangères, à savoir primary_user_code et secondary_user_code, qui n'auraient pas de conflits de noms. L'attribut sessionId de l'entité User ne sera pas mappé à la table TASK, il n'y a donc pas de conflit de nom. – Ish
Non directement liée à la question mais votre clé étrangère pointe vers la colonne 'code' de l'utilisateur. Cette colonne est-elle unique? Selon votre question, je ne pense pas que votre exigence puisse être résolue par une APP commune. Vous aurez besoin de faire la vérification avant de persister/fusionner les entités impliquées – Al1
Cela ne fonctionnera que sur la plupart des RDBM si vous ajoutez un unique = true à la définition de la colonne. Même alors, je pense que c'est une mauvaise pratique: FK devrait toujours pointer vers PK. – fhossfel