Problema aggiunta di mappatura @ManyToOne sulla non-chiave primaria in SQL Server
-
30-09-2019 - |
Domanda
Ho un problema con il cambiamento la mia primavera / hibernate applicazione da MySQL a SQL Server.
Quando Hibernate sta aggiornando il database avviando il server si vuole crea (da set su hibernate.hbm2ddl.auto
update
) il database, ma un-chiave esterna non riesce su errore seguente:
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 mappatura è la seguente:
Tabella 1:
@Id
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
Tabella 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: sguardi SQL piace questo:
chiavi da Tabella 1:
La tabella table1 viene utilizzato anche da un'altra applicazione e quindi questa tabella deve colonna 'id' come chiave primaria. Così table1.id è la chiave primaria della tabella 1. Ma questo table1.id non è usato da Hibernate, perché Hibernate utilizzare il table1.login come id (vedi annotazioni di cui sopra). Ma perché SQL Server tenta di impostare una chiave esterna per table1.id e non a table1.login?
Grazie
Soluzione
Ecco cosa la specifica JPA scrive l'annotazione Id
:
9.1.8 Id annotazione
L'annotazione Id specifica il Proprietà chiave primaria o di un campo entità. L'annotazione Id può essere applicata in un'entità o mappata superclasse.
Per impostazione predefinita, la colonna mappata per la chiave principale del soggetto che si presume essere la chiave primaria del primario tavolo. Se non l'annotazione
Column
è specificato, il nome della colonna chiave primaria si presume essere il nome del Proprietà chiave primaria o il campo.
Sono tentato di dire che le cose si comportano secondo le specifiche (e la proprietà login
viene effettivamente mappato sulla colonna id
). Provare per specificare un'annotazione Column
:
@Id @Column(name = "login")
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
Non riesco a ricreato il table1 perché questo è un tavolo excisting. Devo usare l'opzione ALTER TABLE dalla DLL:. "Alter table table2 vincolo aggiuntivo FK1751F2B3CEB31922 chiave esterna (table1_login) riferimenti table1" e io invece voglio l'integrità referenziale
Per chiarire, qui è che cosa dice Wikipedia chiavi esterne: nella chiave stranieri una colonna o un insieme di colonne in uno (riferimento) tabella che fa riferimento a una serie di colonne in un'altra tabella (riferimento). Le colonne della tabella di riferimento deve essere la chiave primaria o altra chiave candidata ??strong> nella tabella di riferimento.
Così, mentre non è possibile applicare quanto sopra ALTER (table1_login
non può fare riferimento alla id
di table1, è possibile effettuare login
unico nella tabella 1 e creare un vincolo FK che avrebbe riferimento login
. qualcosa del genere:
ALTER TABLE table2
ADD CONSTRAINT FK_table2_table1
FOREIGN KEY (table1_login)
REFERENCES table1(login)
Questo presuppone si è aggiunto un vincolo UNIQUE
al login in tabella 1.
Vedi anche
Altri suggerimenti
Modifica
Dopo aver letto il messaggio con attenzione ho trovato questo ...
'table1.id' non è lo stesso tipo di dati come riferimento colonna 'table2.table1_login'
Tabella 1 ID -...> Table2 table1_login
ID e di accesso non sono la stesso tipo di dati. Quindi c'è un torto PK-FK relazione intorno ...
Questo suona come si utilizza il collation
sbagliata. Entrambe le colonne bisogno della stessa raccolta. In caso contrario, non si può unirsi a loro.
http://msdn.microsoft.com/ it-it / library / aa174903 (SQL.80) .aspx
Assicurarsi di rimuovere tutte le regole di confronto esplicitamente impostati lo script di creazione del database.