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 - 将 Postgres 服务与自定义容器镜像连接的 Github 操作

java - 同时插入和更新一个表

php - 转义文字,使其用双引号引起来

java - 使用 JPA 的 Spring 安全性。如何配置applicationContext-security.XML文件?(使用DaoAuthenticationProvider)

java - 为什么deleteById遵循双向方法?

JavaFX - 将 css 文件添加到 Maven 元素

java - 我无法连接到数据库 - 程序不知道 JAR 文件在哪里

java - 创建新的 NamedQuery 或构建新的 List 以返回字段值?

java - 在 Java Zookeeper api 中禁用日志消息

java - java 的应用程序引擎问题,在生产中存在前端实例并阻止请求