Problème ajouter cartographie @ManyToOne sur la non-clé primaire dans SQL Server
-
30-09-2019 - |
Question
J'ai un problème avec le changement de ma demande de printemps / mise en veille prolongée de MySql à SQL Server.
Mise en veille prolongée est mise à jour la base de données en démarrant le serveur qu'il veut crée (par hibernate.hbm2ddl.auto
ensemble sur update
) la base de données, mais une clé étrangère échoue en cas d'erreur suivant:
Unsuccessful: alter table table2 add constraint FKDC2DC97ECEB31922 foreign key (login) references table1
Column 'table1.id' is not the same data type as referencing column 'table2.table1_login' in foreign key 'FKDC2DC97ECEB31922'.
la mise en correspondance est la suivante:
Tableau 1:
@Id
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
table2:
@ManyToOne
@JoinColumn (name = "table1_login", referencedColumnName = "login", insertable=false, updatable=false)
public Table1 getTable1() {
return table1;
}
public void setTable1(Table1 table1) {
this.table1= table1;
}
++ modifier: SQL ressemble aime ceci:
clés de table1:
Le tableau table1 est également utilisé par une autre application et donc ce tableau a besoin de la colonne « id » comme clé primaire. Donc table1.id est la clé primaire de table1. Mais cette table1.id n'est pas utilisé par mise en veille prolongée, car veille prolongée utilisent le table1.login comme id (voir les annotations ci-dessus). Mais pourquoi est-SQL Server tente de définir une clé étrangère à table1.id et non à table1.login?
Merci
La solution
Voici ce que la spécification JPA écrit à propos de l'annotation Id
:
9.1.8 Id Annotation
L'annotation Id indique la propriété clé primaire ou d'un champ entité. L'annotation Id peut être appliqué à une entité ou mappé superclasse.
Par défaut, la colonne cartographié pour la clé primaire de l'entité est supposée être la clé primaire du primaire table. Si aucune annotation est
Column
spécifié, le nom de la colonne de clé primaire est supposé être le nom du propriété clé primaire ou sur le terrain.
Je suis tenté de dire que les choses se comportent selon les spécifications (et la propriété se fait login
mappée sur la colonne de id
). Essayez de spécifier une annotation Column
:
@Id @Column(name = "login")
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
Je ne peux pas recréée le tableau 1 parce que c'est une table de excisting. Je dois utiliser l'option alter table de la DLL. « Contrainte table2 alter table add FK1751F2B3CEB31922 références clés étrangères (table1_login) table1 » et je veux plutôt l'intégrité référentielle
Pour clarifier, voici ce que dit Wikipedia clés étrangères: les identifie clé est un colonne ou un ensemble de colonnes dans un tableau (référence) qui fait référence à un ensemble de colonnes dans une autre table (référencé). Les colonnes de la table de référence doit être la clé primaire ou une autre clé candidate dans la table référencée.
Ainsi, alors que vous ne pouvez pas appliquer la déclaration ci-dessus alter (table1_login
ne peut pas faire référence à la id
de table1, vous pouvez faire login
uniques dans le tableau 1 et créer une contrainte FK qui référence login
. quelque chose comme ça:
ALTER TABLE table2
ADD CONSTRAINT FK_table2_table1
FOREIGN KEY (table1_login)
REFERENCES table1(login)
Cela suppose ajouté une contrainte de UNIQUE
lors de la connexion dans le tableau 1.
Voir aussi
Autres conseils
EDIT:
Après avoir lu attentivement le message que je trouve cela ...
'table1.id' est pas le même type de données comme référence la colonne 'table2.table1_login'
Tableau 1 ID -...> Table2 table1_login
ID et connexion ne sont pas le même type de données. Donc, il y a une mauvaise relation PK-FK autour ...
Cela sonne comme vous utilisez le mauvais collation
. Les deux colonnes ont besoin du même classement. Sinon, vous ne pouvez pas les rejoindre.
http://msdn.microsoft.com/ fr-fr / bibliothèque / aa174903 (SQL.80) .aspx
Assurez-vous que vous supprimez tous les classements explicitement définis sur le script de création de base de données.