如何在Java/JPA中为Oracle数据库检索UUID值



我使用的是Oracle数据库,必须定义一个UUID列。我关注了其他帖子,并使用regex模式为主键创建了表:

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})', '1-2-3-4-5'),
NAME VARCHAR2(40)  NOT NULL
);

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

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;
}
}

当我检索表值时,由于UUID数据类型的原因,我不会得到存储在数据库中的ID_UUID的相同值(如果我将其更改为字符串,我可以提取正确的值(。我的限制是在从Postgre迁移到Oracle数据库时使用UUID类型,并且不能更改实体类。是否可以使用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;

最新更新