Spring Data JPAとMySQL 8.0とUUIDでEntityNotFoundException: Unable to find

Spring Boot 2.5.5 と MySQL 8.0 で spring-boot-starter-data-jpa を使用してアプリケーションを作成し、Entity アノテーションを付けたクラスの主キーを UUID としました。例えば下記のような感じです。

@Entity
public class MokyuEntity {

  @Id
  private UUID uuid = UUID.randomUUID();

...

アプリケーションで自動でテーブルを作成させると、下記のような create 文が発行されていました。UUID はデフォルトでは binary(255) で作成されるようです。

Hibernate: create table `mokyu_entity` (`uuid` binary(255) not null, primary key (`uuid`)) engine=InnoDB

これにより作成されたテーブルに対して、JpaRepository を継承したクラスの save メソッドでエンティティを保存することができ、UUID も格納されていました。

一方で、JpaRepository を継承したクラスの find 系のメソッドでこのエンティティを取得しようとすると下記のようなエラーとなりました。

javax.persistence.EntityNotFoundException: Unable to find mokyu.domain.entity.MokyuEntity with id 3a111ea0-6746-407c-8353-ae88ce36bce2

該当する UUID を持つエンティティが存在しないとのことです。テーブルには binary でエンティティの UUID が格納されているのに対し、文字列の UUID でエンティティを取得しようとしています。

これを解消するひとつの例としては、Entity アノテーションを付けたクラスで Id アノテーションを付けた主キーに対してさらに Type アノテーションを付けて UUID を文字列としてテーブルに保存するようにします。

@Entity
public class MokyuEntity {

  @Type(type = "uuid-char")
  @Id
  private UUID uuid = UUID.randomUUID();

...

これにより、アプリケーションで自動でテーブルを作成させると、下記のような create 文が発行されました。

Hibernate: create table `mokyu_entity` (`uuid` varchar(255) not null, primary key (`uuid`)) engine=InnoDB