Frage

Ich habe ein Problem mit meiner Feder / Hibernate Anwendung von MySQL auf SQL Server zu ändern.

Wenn Hibernate die Datenbank aktualisiert wird durch Starten des Servers schafft er will (durch hibernate.hbm2ddl.auto Satz auf update) der Datenbank, sondern ein Fremdschlüssel nicht auf folgende Fehlermeldung:

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'.

Die Zuordnung ist wie folgt:

Tabelle1:

@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;
}

++ edit: SQL Aussehen gefällt das:

alt text

Tasten aus table1:

alt text

Die Tabelle TABLE1 auch von einer anderen Anwendung verwendet wird, und daher muss diese Tabelle die Spalte ‚id‘ als Primärschlüssel. So table1.id ist Primärschlüssel von Tabelle1. Aber diese table1.id wird nicht von Hibernate verwendet, da Hibernate die table1.login als ID verwenden (siehe Anmerkungen oben). Aber warum versucht SQL Server einen Fremdschlüssel auf table1.login table1.id und nicht?

Danke

War es hilfreich?

Lösung

Hier ist, was die JPA-Spezifikation schreibt über die Id Anmerkung:

  

9.1.8 Id Annotation

     

Die Id Anmerkung gibt die   Primärschlüsseleigenschaft oder Feld eines   Entität. Die Id-Annotation kann   in einer Entität angewendet oder kartiert   geordneten Klasse.

     

In der Standardeinstellung die abgebildete Spalt für die   Primärschlüssel der Einheit wird angenommen,   der primäre Schlüssel des primären zu sein   Tabelle. Wenn keine Column Anmerkung ist   angegeben, die Primärschlüsselspalte Name   wird angenommen, dass der Name der sein   Primärschlüssel Eigenschaft oder ein Feld.

Also ich bin versucht zu sagen, dass die Dinge so verhalten, als gemäß der Spezifikation (und die login Eigenschaft wird auf der id Spalte tatsächlich abgebildet). Versuchen Sie, eine Column Anmerkung an:

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

  

Ich kann nicht neu erstellt die tabelle1 weil dies eine excisting Tabelle. Ich muß die alte table-Option aus dem DLL verwenden. "Alter table table2 Add Constraint FK1751F2B3CEB31922 Fremdschlüssel (table1_login) Referenzen table1" und ich mag vielmehr die referentielle Integrität

zu klären, hier ist was Wikipedia sagt über Fremdschlüssel: die Fremdschlüssel identifiziert eine Spalte oder eine Gruppe von Spalten in einer (Referenzierung) Tabelle, die auf einen Satz von Spalten in einer anderen (referenziert) Tabelle bezieht. Die Spalten in der verweisenden Tabelle muss der Primärschlüssel oder einem anderen Kandidatenschlüssel sein in der referenzierten Tabelle.

So, während Sie die obigen alte Anweisung nicht anwenden können (table1_login nicht die id von table1 verweisen kann, können Sie login machen einzigartig in Tabelle 1 und erstellen Sie eine FK-Einschränkung, die login verweisen würde. etwas wie folgt aus:

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

Dies setzt voraus, Sie UNIQUE Einschränkung bei der Anmeldung in Tabelle 1 gegeben.

Siehe auch

Andere Tipps

EDIT:

Nach dem Lesen der Nachricht sorgfältig fand ich diese ...

‚table1.id‘ ist nicht der gleiche Datentyp wie die verweisende Spalte ‚table2.table1_login‘

Tabelle 1 ID -...> Table2 table1_login

ID und Login ist nicht der gleiche Datentyp. So gibt es eine falsche PK-FK Beziehung um ...


Das klingt wie Sie verwenden den falschen collation. Beide Spalten müssen die gleiche Sortierung. Ansonsten kann man sich nicht mitmachen.

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

Stellen Sie sicher, dass Sie alle explizit festgelegt Sortierungen auf dem Datenbankerstellung Skript entfernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top