SQL Serverでプライマリキー以外に@ManyTooneマッピングを追加するのに問題

StackOverflow https://stackoverflow.com/questions/3530393

質問

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はこれが好きです:

alt text

テーブル1からのキー:

alt text

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

データベース作成スクリプトですべての明示的に設定されたコレクションを削除するようにしてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top