如何检索 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 或更高版本,则可以使用它。
- 创建自己的用户类型
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;
}
}
- 实现一个
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());
}
}
- 将自定义类型应用于您的实体
特定于实体:
@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;
我正在使用 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 或更高版本,则可以使用它。
- 创建自己的用户类型
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;
}
}
- 实现一个
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());
}
}
- 将自定义类型应用于您的实体
特定于实体:
@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;