JTS - Hibernate + Postgres + UUID 冲突

5
我将为您翻译以下内容:

我正在使用Hibernate 5.0 + Postgres 9.4

我的实体使用UUID作为标识符。

该项目还使用了hibernate-spatial

id属性仅被注释为

@Id
@GeneratedValue
private UUID id;

在持久化任何实体(不仅是具有几何数据的实体)后,我会收到以下错误:

column "id" is of type geometry but expression is of type uuid

看起来对我来说存在一些类型映射冲突; 尽管我不是一个Hibernate类型映射的专家。

有谁能帮助我克服这个问题吗?


数据库中ID列的类型是什么? - SubOptimal
@SubOptimal 它被创建为“geometry”,因为UUIDGeometry都映射到java.sql.Types.OTHER - Stefano Cazzola
你的意思是你有一个 CREATE TABLE some_table (id geometry, ...),现在想要将 UUID 映射到它上面? - SubOptimal
1
@SubOptimal 不是的。模式(在开发模式下)是由Hibernate创建的。只要我没有添加空间集成(hibernate-spatial:5.0.7),UUID字段就会正确地创建为pg-uuid。添加空间内容后,映射发生了变化,因为java.util.UUIDcom.vividsolutions.Geometry都被映射到java.sql.Types.OTHER。现在的问题是如何解决这种映射冲突。 - Stefano Cazzola
1
也许这可能是解决方案 https://dev59.com/v2855IYBdhLWcg3wKxDc。 - SubOptimal
@SubOptimal 是的,这实际上是一个解决方案(因此+1)。但它有几个缺点:1. 实体是Hibernate感知的;2. 实体是特定于数据库的。最理想的结果是使所有实体可重用于不同的ORM和不同的DBMS。我已经花了很多时间在这方面工作,我找到的唯一解决方案是将UUID视为字符串(这不是非常高效)。 - Stefano Cazzola
1个回答

6
请查看此答案和原始的讨论线程
对我来说,指定columnDefinition = "uuid"恰好解决了相同的问题。
@Entity
public class MyEntity {
    @Id
    @GeneratedValue
    @Column( columnDefinition = "uuid", updatable = false )
    public UUID getId() {
        return id;
    }
}

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