如何检索 Oracle 数据库 Java/JPA 中的 UUID 值?

How to retrieve UUID value in Java/JPA for Oracle database?

我正在使用 Oracle 数据库并且必须定义一个 UUID 列。我关注了其他帖子并使用主键的正则表达式模式创建了 table:

CREATE TABLE TEST_UUID (
    ID_UUID VARCHAR(255)
    DEFAULT REGEXP_REPLACE(RAWTOHEX(SYS_GUID()), '([A-F0-9]{8})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{12})', '----'),
    NAME VARCHAR2(40)  NOT NULL
);

在我的实体 class 中,我必须定义 UUID 类型的 ID_UUID 列(不能将其定义为字符串)。实体 class 如下所示:

import java.util.UUID;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "test_uuid")
public class TestUuid {

    @Id
    @Column(name = "id_uuid")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private UUID idUuid;

    @Column(name = "name")
    private String name;

    /**
     * @return the idUuid
     */
    public UUID getIdUuid() {
        return idUuid;
    }

    /**
     * @param idUuid the idUuid to set
     */
    public void setIdUuid(UUID idUuid) {
        this.idUuid = idUuid;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

}

当我检索 table 值时,由于 UUID 数据类型(如果我将其更改为字符串,我能够拉出正确的值)。我的限制是使用 UUID 类型,因为我正在从 Postgre 迁移到 Oracle 数据库并且无法更改我的实体 class。是否可以使用 UUID 数据类型检索正确的值?

您需要将存储和检索 UUID 类型的自定义类型定义为 VARCHAR。

参见 Hibernate UUID 类型实现。
https://github.com/hibernate/hibernate-orm/blob/main/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/UUIDJavaType.java
如果您有 Hibernate 5 或更高版本,则可以使用它。

  1. 创建自己的用户类型
public class UUIDType extends AbstractSingleColumnStandardBasicType<UUID> {

    public static final UUIDType INSTANCE = new UUIDType();
    public static final String NAME = "UUIDType";

    public UUIDType() {
        super(VarcharTypeDescriptor.INSTANCE, UUIDTypeDescriptor.INSTANCE);
    }

    @Override
    public String getName() {
        return NAME;
    }
}
  1. 实现一个 UUIDTypeDescriptor 以将 UUID 存储和检索为 VARCHAR
public class UUIDTypeDescriptor extends AbstractTypeDescriptor<UUID> {

    public static final UUIDTypeDescriptor INSTANCE = new UUIDTypeDescriptor();

    public UUIDTypeDescriptor() {
        super(UUID.class, ImmutableMutabilityPlan.INSTANCE);
    }

    @Override
    public String toString(UUID uuid) {
        return uuid.toString();
    }

    @Override
    public UUID fromString(String s) {
        return UUID.fromString(s);
    }

    @Override
    public <T> T unwrap(UUID uuid, Class<T> type, WrapperOptions wrapperOptions) {
        if (uuid == null) return null;

        if (String.class.isAssignableFrom(type)) {
            return (T) uuid.toString();
        }

        throw unknownUnwrap(type);
    }

    @Override
    public <T> UUID wrap(T value, WrapperOptions wrapperOptions) {
        if (value == null)
            return null;

        if(value instanceof String) {
            return UUID.fromString((String) value);
        }

        throw unknownWrap(value.getClass());
    }
}
  1. 将自定义类型应用于您的实体

特定于实体:

@TypeDef(name = UUIDType.NAME, 
         typeClass = UUIDType.class,
         defaultForType = UUID.class)
@Entity
@Table(name = "test_uuid")
public class TestUUID {

}

package-info.java 文件中的包层:

@TypeDef(
    name = UUIDType.NAME,
    typeClass = UUIDType.class,
    defaultForType = UUID.class
)
package com.model;