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:

text alt

clés de table1:

text alt

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top