SQL Serverでプライマリキー以外に@ManyTooneマッピングを追加するのに問題
-
30-09-2019 - |
質問
Spring/HibernateアプリケーションをMySQLからSQL Serverに変更することに問題があります。
Hibernateがサーバーを起動してデータベースを更新しているとき、彼は作成したい( hibernate.hbm2ddl.auto
上の設定 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はこれが好きです:
テーブル1からのキー:
テーブルテーブル1は他のアプリケーションでも使用されているため、このテーブルにはプライマリキーとして列「ID」が必要です。したがって、表1.IDはテーブル1の主要なキーです。ただし、このtable1.idは、hibernateがtable1.loginをidとして使用するため、冬眠によっては使用されません(上記の注釈を参照)。しかし、なぜSQL Serverは、Table1.loginではなく、Table1.idに外部キーを設定しようとしているのですか?
ありがとう
解決
JPA仕様が書いているものは次のとおりです Id
注釈:
9.1.8 IDアノテーション
IDアノテーションは、エンティティの主要なキープロパティまたはフィールドを指定します。 IDアノテーションは、エンティティまたはマッピングされたスーパークラスに適用できます。
デフォルトでは、エンティティの主要なキーのマッピングされた列は、プライマリテーブルの主キーであると想定されています。いいえの場合
Column
注釈が指定されており、主キー列名は主要なキープロパティまたはフィールドの名前であると想定されています。
だから私は物事が仕様に従って振る舞うと言いたいです(そして login
プロパティは実際にマッピングされます id
桁)。 aを指定してみてください Column
注釈:
@Id @Column(name = "login")
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
Table1を再現することはできません。 dllの変更テーブルオプションを使用する必要があります。「Alter table22 constraint fk1751f2b3ceb31922外部キー(table1_login)参照table1 "を使用する必要があります。
明確にするために、ウィキペディアが外国の鍵について言っていることは次のとおりです。 外部キーは、別の(参照)テーブルの一連の列を指す1つの(参照)テーブルの列または列のセットを識別します。参照テーブルの列 主キーまたは他の候補キーでなければなりません 参照テーブルで。
したがって、上記の変更ステートメントを適用することはできませんが(table1_login
参照できません id
テーブル1の、作ることができます login
個性的 表1に、参照するFK制約を作成します login
. 。そんな感じ:
ALTER TABLE table2
ADD CONSTRAINT FK_table2_table1
FOREIGN KEY (table1_login)
REFERENCES table1(login)
これは、あなたが追加したと仮定します UNIQUE
表1のログインの制約。
参照してください
他のヒント
編集:
メッセージを注意深く読んだ後、私はこれを見つけました...
'table1.id'は、列の参照 'table2.table1_login'と同じデータ型ではありません
表1。ID - >表2。Table1_login.
IDとログインは同じデータタイプではありません。だから、周囲に間違ったPK-FK関係があります...
これはあなたが間違っていることを使用しているように聞こえます collation
. 。どちらの列も同じ照合が必要です。それ以外の場合は、参加できません。
http://msdn.microsoft.com/en-us/library/aa174903(sql.80).aspx
データベース作成スクリプトですべての明示的に設定されたコレクションを削除するようにしてください。