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:

alt text

chiavi da Tabella 1:

alt text

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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top