データベースに正確な外部キー制約を設定せずに、多対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はどのステートメントにも含まれていません。
そのような参照に基づいて関係を持つことは可能ですか(データベースに外部キーがない場合、主キー以外の列へ)?他に何か足りないものはありますか?
前もって感謝します。