java - 将 UUID 与 EclipseLink 和 PostgreSQL 一起使用

标签 java postgresql jpa eclipselink jpa-2.0

我想为对象的主键使用 PostgreSQL uuid 类型。 为此,我创建了一个转换器(实现 Converter 接口(interface))。 相关代码如下:

    @Override
    public void initialize(DatabaseMapping mapping, Session session) {
        final DatabaseField field;
        if (mapping instanceof DirectCollectionMapping) {
            field = ((DirectCollectionMapping) mapping).getDirectField();
        } else {
            field = mapping.getField();
        }

        field.setSqlType(Types.OTHER);
        field.setTypeName("uuid");
        field.setColumnDefinition("UUID");
    }

然后我用下面的注释注释了相关的实体 X:

@Converter(name="uuidConverter",converterCalss=UUIDConverter.class)
@Convert("uuidConverter")
@Id
public UUID getId()
{
    return id;
}

问题是我有另一个类 (Y) 具有以下定义:

@ManyToOne(targetEntity = X.class)
@JoinColumn(name = "x_id")
public X getX();

尽管 EclipseLink 按预期创建了表,但它在尝试插入类型 Y 的对象时向数据库发送了一个字符串。 Postgres 返回以下错误消息:

column "id" is of type uuid but expression is of type character varying at character

任何解决方案/解决方法将不胜感激。

最佳答案

我在使用 EclipseLink JPA + Postgresql + UUID 作为主键时遇到了同样的问题。

为了解决这个问题,我合并了 Github 和下面链接中的代码: https://forums.oracle.com/forums/thread.jspa?messageID=4584157

下面的 UUIDConverter 代码对我有用,尽管代码肯定不是最好的。

public void initialize(DatabaseMapping ARGMapping, Session ARGSession)
{
    final DatabaseField Field;
    if (ARGMapping instanceof DirectCollectionMapping)
    {
        Field = ((DirectCollectionMapping) ARGMapping).getDirectField();
    }
    else
    {
        Field = ARGMapping.getField();
    }
    Field.setSqlType(Types.OTHER);
    Field.setTypeName("uuid");
    Field.setColumnDefinition("UUID");

    for (DatabaseMapping m : ARGMapping.getDescriptor().getMappings())
    {
        assert OneToOneMapping.class.isAssignableFrom(ManyToOneMapping.class);
        if (m instanceof OneToOneMapping)
        {
            for (DatabaseField field : ((OneToOneMapping) m).getForeignKeyFields())
            {
                field.setSqlType(Types.OTHER);
                field.setColumnDefinition("UUID");
                field.setTypeName("uuid");
            }
        }
    }
}

关于java - 将 UUID 与 EclipseLink 和 PostgreSQL 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13346089/

相关文章:

postgresql - 当我将记录 (A,B) 视为与 (B,A) 相同时如何删除重复记录

java - 在受控对象中更新的实体未在作业中更新

JavaApplet与Socket Server,刷新页面不会关闭端口

java - 如何从数据库中获取自动生成的id

java - 我们可以在同一个通用占位符中传递单个对象和对象列表吗

postgresql - Postgres : Is it possible to use Point in Time Recovery to rollback to previous states?

无法使用 libpq 连接到 postgreSQL 服务器

Java应用程序和高可用性

hibernate - JPA 中的自定义主键生成器

java - 使用 JPA 更新多行