无法使用 Hibernate 在 H2 2.0.202 中存储 UUID

Unable to store UUIDs in H2 2.0.202 with Hibernate

我们使用 H2 进行集成测试已经有一段时间了。现在 H2 2.0.202 已经发布,我们正在尝试将我们的代码库升级到它。我们无法持久化使用 java.util.UUID 作为类型的实体。考虑以下示例

public class MyEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private UUID id;
}

如果我们尝试使用 Hibernate 将其保存在 H2 数据库中,则会失败并显示 JdbcSQLDataException 消息 Value too long for column。测试就这么简单

@DataJpaTest
class H2Test {

  @Autowired MyRepository myRepository;

  @Test
  void testSave() {
    myRepository.save(new MyEntity());
    Assertions.assertThat(myRepository.findAll()).hasSize(1);
  }
}

您可以在 PasteBin 上找到完整的堆栈跟踪。

我们正在使用 org.hibernate.spatial.dialect.h2geodb.GeoDBDialect,这似乎是导致此问题的原因之一。如果我们删除它,上面的简单测试用例就可以正常工作,不幸的是我们使用的是空间数据,所以我们需要这种方言。 我想知道这是否只是 H2 2.0.202 和 Hibernate 之间缺少兼容性?或者我们可以在配置中做些什么?我在 hibernate jira 中找不到与此问题匹配的问题,而且我也无法创建。

我很确定原因是 UUID 和 Hibernate/Hibernate 中的几何类型之间存在冲突 Spatial.See 例如本期:https://hibernate.atlassian.net/browse/HHH-11490

该问题应在 5.4.31 及更高版本中解决。

也可以通过显式注解id成员变量来解决 @Column(columnDefinition = "uuid") 注释。