Hibenateで関連エンティティが存在しない場合の例外を抑制する

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は同様に例外が発生、それ以外の実装では例外は発生しない模様。

hayassh.hatenadiary.org

振り返り

Javadocを読む限り、 @OneToOne(optional = true) でうまくいくかと思ったが駄目だった。詳細については未調査。