他と1対1の関係を持つエンティティでjpqlクエリを実行中に予期しない動作が発生しました。キーポイントは、ルートエンティティのプライマリキーからIDではない宛先エンティティのフィールドまでの関係であることです。ここでjpa hibernate @OneToOne @JoinColumn referencedColumnNameは無視されました
は一例です:
// root entity
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@Column(name = "PERSON_ID")
private long id;
private String name;
@OneToOne(optional = false)
@JoinColumn(name = "PERSON_ID", referencedColumnName = "PERSON_ID", insertable = false, updatable = false, unique = true)
private Address mainAddress;
...
}
// referenced entity
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@Column(name = "ADDRESS_ID")
private long id;
@Column(name = "PERSON_ID")
private long personId;
...
}
次JPQLクエリ:
select p from Person p left join fetch p.mainAddress
は、次のOracle SQLクエリを生成します:
SELECT ... FROM PERSON p LEFT OUTER JOIN ADDRESS a ON p.PERSON_ID = a.ADDRESS_ID
私が期待している間:
SELECT ... FROM PERSON p LEFT OUTER JOIN ADDRESS a ON p.PERSON_ID = a.PERSON_ID
基本的には、referencedColumnName = "PERSON_ID"属性の属性は無視され、結合は主キーに対して実行されます。
誰かが私の理由を説明できますか?
を使用し、私は逆の関係をマッピングし、mappedBy属性を使用することで解決しました。 ORMは、この方法で結合列を認識します。ありがとう@アラン・ヘイ – leocasucci