Hibernate annotations avec colonne commune étrangère et de la clé primaire
Je vais avoir quelques problèmes de modélisation d'une clé étrangère de la façon dont je l'aime en veille prolongée 4.1.9
J'ai pratiquement le code suivant:
@Entity
@XmlRootElement
@Table(name="User")
public class UserVO
{
private String email;
@Id
@Column(name="email", unique=true, nullable=false)
@XmlElement
public String getEmail()
{
return this.email;
}
}
et ce:
@Entity
@XmlRootElement
@Table(name="Authentification")
public class AuthentificationVO
{
private String email;
private UserVO user;
@Id
@Column(name="email", unique=true, nullable=false)
@XmlElement
public String getEmail()
{
return this.email;
}
@OneToOne(cascade = CascadeType.ALL)
@ForeignKey(name="user_fk")
public UserVO getUser()
{
return this.user;
}
}
Le point de tout cela, c'est d'avoir une colonne nommée e-mail dans les deux tables, ce qui devrait aussi servir comme clé primaire pour l'Utilisateur et l'Authentification des tables. Pour quelque raison, quand je l'exécute, Hibernate insiste sur l'ajout d'une colonne à l'Authentification table appelée user_email, mais je veux qu'il à utiliser la déjà existant colonne nommée e-mail.
J'ai essayé de regarder autour pour une solution à cela et j'ai essayé d'utiliser mappedBy annotation pour obtenir la droite, le long de avec JoinColumn, mais rien ne semble faire l'affaire.
OriginalL'auteur Chris | 2013-03-08
Vous devez vous connecter pour publier un commentaire.
Ce qui a fait le tour de la fin, c'est l'ajout de l'annotation suivante:
J'ai enlevé le ForeignKey annotation, depuis qu'il a été ignoré lors de la création de la table. Le seul effet est la dénomination de la contrainte, qui est maintenant générée automatiquement en veille prolongée et je peux vivre avec ça.
OriginalL'auteur Chris
Pour un-à-un, vous devrez spécifier
@JoinColumn(name="user_fk")
pour la cartographie.Le
@ForeignKey
annotation est juste là pour remplacer le nom de la clé étrangère générées par hibernate, pour ne pas dire à hiberner, dont la colonne à utiliser (ce qui est le rôle de la@JoinColumn
)[Edit après les commentaires]
En fait, comme vous le mapping sur la clé primaire, vous devez utiliser le
@MapsId
annotation à dire hibernate vous êtes à la cartographie de l'Id de laOneToOne
de l'entité associée.Votre correspondance doit alors devenir :
@PrimaryKeyJoinColumn
devrait faire l'affaire !Je suis désolé de dire que la clé étrangère n'est jamais créé, peu importe si j'utilise JoinColumn ou PrimaryKeyJoinColumn tant que l'Id de l'annotation est présente sur le champ adresse e-mail dans le AuthentificationVO classe. Les tables sont créées à l'amende et sont remplis avec des données, mais le fk n'est jamais créé.
avez-vous spécifié à la fois
@PrimaryKeyJoinColumn
ET@ForeignKey
?Oui je l'ai fait, deux d'entre eux sont présents.
OriginalL'auteur benzonico