Problème lors de l'ajout du mappage @ManyToOne sur une key non principale dans SQL Server

J'ai un problème avec la modification de mon application Spring / Hibernate de MySQL à SQL Server.

Quand Hibernate met à jour la database en démarrant le server qu'il veut créer (par hibernate.hbm2ddl.auto mis à update ) la database mais une key étrangère échoue sur l'erreur suivante:

 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 cartographie est la suivante:

Tableau 1:

 @Id public Ssortingng getLogin() { return login; } public void setLogin(Ssortingng login) { this.login = login; } 

Tableau 2:

 @ManyToOne @JoinColumn (name = "table1_login", referencedColumnName = "login", insertable=false, updatable=false) public Table1 getTable1() { return table1; } public void setTable1(Table1 table1) { this.table1= table1; } 

++ edit: SQL ressemble à ceci:

texte alt

keys de table1:

texte alt

La table table1 est également utilisée par une autre application et donc cette table a besoin de la colonne 'id' comme key primaire. Donc table1.id est la key primaire de table1. Mais cette table1.id n'est pas utilisée par hibernate, car hibernate utilise le file table1.login comme id (voir les annotations ci-dessus). Mais pourquoi SQL Server essaie-t-il de définir une key étrangère sur table1.id et non sur table1.login?

Merci

Voici ce que la spécification JPA écrit à propos de l'annotation Id :

9.1.8 Id Annotation

L'annotation Id spécifie la propriété ou le champ de key primaire d'une entité. L'annotation Id peut être appliquée dans une entité ou une superclass mappée.

Par défaut, la colonne mappée pour la key primaire de l'entité est supposée être la key primaire de la table primaire. Si aucune annotation de Column n'est spécifiée, le nom de la colonne de key primaire est supposé être le nom de la propriété ou du champ de key primaire.

Donc, je suis tenté de dire que les choses se comportent selon la spécification (et la propriété de login est réellement mappée sur la colonne id ). Essayez de spécifier une annotation de Column :

 @Id @Column(name = "login") public Ssortingng getLogin() { return login; } public void setLogin(Ssortingng login) { this.login = login; } 

Je ne peux pas recréer la table1 parce que c'est une table excistante. Je dois utiliser l'option alter table de la DLL: "alter table table2 add contrainte FK1751F2B3CEB31922 key étrangère (table1_login) references table1" et je préfère l'intégrité référentielle.

Pour clarifier, voici ce que dit Wikipédia à propos des foreign keys: la key étrangère identifie une colonne ou un set de colonnes dans une table (référençant) qui fait reference à un set de colonnes dans une autre table (référencée). Les colonnes de la table de reference doivent être la key primaire ou une autre key candidate dans la table référencée.

Donc, bien que vous ne puissiez pas appliquer l'instruction alter ci-dessus ( table1_login ne peut pas referencer l' id de table1, vous pouvez rendre la login unique dans table1 et créer une contrainte FK qui referencerait la login .

 ALTER TABLE table2 ADD CONSTRAINT FK_table2_table1 FOREIGN KEY (table1_login) REFERENCES table1(login) 

Cela suppose que vous avez ajouté une contrainte UNIQUE lors de la connection dans la table1.

Voir également

  • Contraintes de key étrangère

MODIFIER:

Après avoir lu le message attentivement, j'ai trouvé ça …

'table1.id' n'est pas le même type de données que la colonne de reference 'table2.table1_login'

Tableau 1. ID -> table2. table1_login .

L'ID et le login ne sont pas le même type de données. Il y a donc une mauvaise relation PK-FK autour de …


Cela semble que vous utilisez la mauvaise collation . Les deux colonnes ont besoin de la même collation. Sinon, vous ne pouvez pas les join.

http://msdn.microsoft.com/en-us/library/aa174903(SQL.80).aspx

Assurez-vous de supprimer tous les classments définis explicitement dans le script de création de database.