4

spring/hibernate アプリケーションを MySql から SQL Server に変更する際に問題があります。

hibernate.hbm2ddl.autoHibernate がサーバーを起動してデータベースを更新しているときに、( set on で) データベースを作成したいのですupdateが、次のエラーで外部キーが失敗します:

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

マッピングは次のとおりです。

表1:

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

テーブル 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;
}

++編集: SQL は次のようになります。

代替テキスト

table1 のキー:

代替テキスト

テーブル table1 は他のアプリケーションでも使用されているため、このテーブルには列「id」が主キーとして必要です。したがって、table1.id は table1 の主キーです。ただし、この table1.id は hibernate では使用されません。これは、hibernate が table1.login を ID として使用するためです (上記の注釈を参照)。しかし、SQL Server が外部キーを table1.login ではなく table1.id に設定しようとするのはなぜでしょうか?

ありがとう

4

2 に答える 2

1

編集:

メッセージを注意深く読んだ後、私はこれを見つけました...

'table1.id'は、参照列'table2.table1_login'と同じデータ型ではありません

表1。ID- >table2。table1_login

IDとログインは同じデータ型ではありません。したがって、周りに間違ったPK-FK関係があります...


これは、間違ったを使用しているようですcollation。両方の列に同じ照合が必要です。そうしないと、参加できません。

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

データベース作成スクリプトで明示的に設定されたすべての照合を必ず削除してください。

于 2010-08-20T11:32:27.617 に答える
1

IdJPA仕様が注釈について書いているものは次のとおりです。

9.1.8 ID注釈

Id アノテーションは、エンティティの主キー プロパティまたはフィールドを指定します。Id アノテーションは、エンティティまたはマップされたスーパークラスに適用できます。

デフォルトでは、エンティティの主キーにマップされた列は、主テーブルの主キーであると見なされます。注釈が指定されていない場合Column、主キーの列名は、主キーのプロパティまたはフィールドの名前であると見なされます。

したがって、物事は仕様どおりに動作する (そして、プロパティは実際に列loginにマップされる)と言いたくなります。注釈idを指定してみてください:Column

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

これは既存のテーブルであるため、table1 を再作成できません。DLL のテーブル変更オプションを使用する必要があります。

明確にするために、ウィキペディアが外部キーについて述べていることを次に示します。外部キーは、別の (参照される) テーブルの列のセットを参照する、1 つの (参照する) テーブルの列または列のセットを識別します。参照テーブルの列は、参照テーブルの主キーまたは他の候補キーである必要があります。

したがって、上記の alter ステートメントを適用することはできませんが ( table1table1_loginの を参照できませんが、 table1 で一意にして、 を参照する FK 制約を作成できます。そのようなもの:idlogin login

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

UNIQUEこれは、table1 のログインに制約を追加したことを前提としています。

こちらもご覧ください

于 2010-08-21T09:44:10.613 に答える