1

データベースに正確な外部キー制約を設定せずに、多対1の関係をマッピングすることに問題があります。MySqlデータベースでOpenJPA実装を使用していますが、問題は、挿入ステートメントと選択ステートメント用に生成されたSQLスクリプトにあります。

RootId列を含むLegalEntityテーブルがあります(とりわけ)。また、null許容ではないLegalEntityId列があり、LegalEntityの「RootId」列を参照する値が含まれているはずのAddressテーブルがありますが、データベース制約(外部キー)は設定されていません。

アドレスエンティティがマップされます:


@Entity
@Table(name="address")
public class Address implements Serializable {
    ...

    @ManyToOne(fetch=FetchType.LAZY, optional=false)
    @JoinColumn(referencedColumnName="RootId", name="LegalEntityId", nullable=false, insertable=true, updatable=true, table="LegalEntity")
    public LegalEntity getLegalEntity() {
        return this.legalEntity;
    }
}

SELECTステートメント(LegalEntityのアドレスをフェッチする場合)とINSERTステートメントが生成されます。

SELECT t0.Id, .., t0.LEGALENTITY_ID FROM address t0 WHERE t0.LEGALENTITY_ID = ? ORDER BY t0.Id DESC [params=(int) 2]

INSERT INTO address (..., LEGALENTITY_ID) VALUES (..., ?) [params=..., (int) 2]

上記のステートメントからテーブル属性を省略すると、次のように生成されます。

SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId WHERE t1.Id = ? ORDER BY t0.Id DESC [params=(int) 2]

INSERT INTO address (...) VALUES (...) [params=...]

したがって、LegalEntityIdはどのステートメントにも含まれていません。

そのような参照に基づいて関係を持つことは可能ですか(データベースに外部キーがない場合、主キー以外の列へ)?他に何か足りないものはありますか?

前もって感謝します。

4

1 に答える 1

0

FetchType を熱心に変更してみてください。OpenJPA は、getLegalEntity の呼び出しによって要求されるまで、LegalEntity を照会してはなりません。

また、制約がないことは重要ではありません (私が間違っている場合は誰かが私を修正してください)。

于 2010-04-28T12:08:39.723 に答える