Hibernateで、RepositoryのgetOne(id)を呼ぶと以下のExceptionが発生しました。~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]代わりにfindById(id)を呼んでみると、Exceptionが発生しなくなりました。そこでgetOneメソッドとfindOneメソッドの違いと、このExceptionの原因について調査しました。結論から言うと、トランザクション関係の問題でした。メソッドを呼び出しているのは@Serviceクラスは試作段階だったのでまだ@Transactionalを付けていなかったのですが、付けたら発生しなくなりました。JpaRepositoryのJavadocによればgetOneはReferenceを返しますが、遅延読み込みとトランザクション境界は密接に関係するので、このような現象になっていたようです。Entityクラスに@Proxy(lazy=false)を付ければ解決するという情報も多くありました。遅延読み込みしたいときには使えませんし、あまり本質的な解決になっていないと思ったので、こちらは採用しませんでした。getOneメソッドとfindByIdメソッドの違いfindByIdはCrudRepositoryのメソッドとして、getOneはJpaRepositoryのメソッドとしてそれぞれ定義されています。結局どちらを使ったほうが良いのかというお話ですが、以下の観点からfindById()を使ったほうがよさそうです。MongoDBなどに変更しても、findByIdメソッドがそのまま使用可能(MongoRepositoryはCrudRepositoryを継承)findByIdの戻り値はOptionalなので扱いやすい(getOneの戻り値はEntityそのもの)まとめというわけで、トランザクションと遅延読み込みの問題でした。特段の理由がなければ、getOneよりもfindByIdを使ったほうが良さそうです。getOneの代わりにfindByIdを使えば解決するお話ですが、そもそも@Serviceクラスに@Transactionalを付け忘れている可能性があるので、現象が起きたときは注意が必要です。