JPAの実装としてHibenateを使っている。
既存のテーブルに対して、新規にエンティティクラスを追加し、 @OneToOne
で関連を追加したが、関連元のフィールドがnullを設定可能になっている。
その状態で関連元のエンティティを参照すると、該当のカラムがnullの場合、例外が発生した。
テーブル定義を変えるのは難しく、アノテーションや設定でどうにかできないか調べたのでメモ。
環境
Hibernate 5.6.3.Final。Spring BootからSpring Data JPAを経由して利用。
問題
関連元となるJPA Entityに、以下のような関連を設定。
@OneToOne @JoinColumn(name = "related_id", insertable = false, updatable = false) private RelatedEntity relatedEntity;
関連付けたテーブルの、 related_id
がnullの場合、関連元のエンティティを参照すると、 javax.persistence.EntityNotFoundException
が発生する。
@OneToOne
アノテーションに、 optional = true
を指定しても解消せず。
OneToOne (Jakarta EE 8 Specification APIs)
対応
Hibernateの独自アノテーションになるが、対象のフィールドに @NotFound(action = NotFoundAction.IGNORE)
を追加すると、例外が発生せず、フィールドがnullとなるようになった。
import org.hibernate.annotations.NotFound; import org.hibernate.annotations.NotFoundAction; @OneToOne @JoinColumn(name = "related_id", insertable = false, updatable = false) @NotFound(action = NotFoundAction.IGNORE) private RelatedEntity relatedEntity;
その他のJPA実装の場合
未検証だが、@ManyToOne
の場合、Hibenateは同様に例外が発生、それ以外の実装では例外は発生しない模様。
振り返り
Javadocを読む限り、 @OneToOne(optional = true)
でうまくいくかと思ったが駄目だった。詳細については未調査。