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

8

我们已经使用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中没有找到匹配此问题的问题,也不知道为何无法创建一个问题。
2个回答

24

我相当确定这是Hibernate/Hibernate Spatial中UUID和Geometry类型之间冲突的原因。例如,参见此问题:https://hibernate.atlassian.net/browse/HHH-11490

这个问题应该在5.4.31版本及以后的版本中得到解决。

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


1
哇,那是一个老问题了。我确实搜索过Hibernate的问题,但是抛弃了几个月前的所有内容...谢谢你挖掘出来,星期一我回到工作岗位时会检查一下这是否真的是情况。 - Carsten Hoffmann
4
设置@Column(columnDefinition = "uuid")实际上解决了我在使用嵌入式H2 Spring Boot测试数据库按uuid查询时遇到的问题。谢谢。 - Chris

4

我用以下方法解决了这个问题

  @Id
  @GeneratedValue(generator = "UUID")
  @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
  @Column(name = "id", updatable = false, nullable = false)
  @Type(type = "org.hibernate.type.UUIDCharType") // <-------------------------- THIS LINE
  private UUID id;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接