修改生成的 ID、UUID、删除破折号
Modifying the generated ID, UUID, removing dashes
由于与现有系统的兼容性原因,我必须将 UUID 类型存储为不带破折号的 varchar。最简单的解决方案是什么?
我在下面创建了一个示例 class 来演示这个问题。当 class 的实例被持久化时,UUID 在数据库中很好,只是 tab1_id
列中的破折号,例如583cfe1a-d671-47f9-9cd5-3f1e8f717856
。 我需要的是: 583cfe1ad67147f99cd53f1e8f717856
。所以问题是我如何在生成后更改生成的 id。
我正在使用 spring-boot 和 hibernate 作为 JPA 实现。任何建设性的回应表示赞赏。提前致谢。
@Entity
@Table(name = "tab1")
@XmlRootElement
public class Tab1 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
@Column(name = "tab1_id", updatable = false, nullable = false, columnDefinition = "uuid")
@Type(type = "org.hibernate.type.UUIDCharType")
private UUID tab1Id;
@Column(name = "name")
private String name;
....
您需要将其保存在数据库中吗?如果是这样的话,我想这是不可能的。但是如果你想在没有破折号的情况下检索它,只需执行实体的 getUUID 方法 class return 一个没有破折号的字符串。
您必须实施自定义 ID 生成器,并且您的实体将具有字符串 ID,因为它不再是有效的 UUID。
像这样的东西会起作用
@Id
@GenericGenerator(name = "mygen", strategy = "com.abc.generator.IdGenerator")
@GeneratedValue(generator = "mygen")
private String id;
您的生成器将如下所示:
package com.abc.generator;
import java.io.Serializable;
import java.util.UUID;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;
public class IdGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o)
throws HibernateException {
return UUID.randomUUID().toString().replace("-", "");
}
}
由于与现有系统的兼容性原因,我必须将 UUID 类型存储为不带破折号的 varchar。最简单的解决方案是什么?
我在下面创建了一个示例 class 来演示这个问题。当 class 的实例被持久化时,UUID 在数据库中很好,只是 tab1_id
列中的破折号,例如583cfe1a-d671-47f9-9cd5-3f1e8f717856
。 我需要的是: 583cfe1ad67147f99cd53f1e8f717856
。所以问题是我如何在生成后更改生成的 id。
我正在使用 spring-boot 和 hibernate 作为 JPA 实现。任何建设性的回应表示赞赏。提前致谢。
@Entity
@Table(name = "tab1")
@XmlRootElement
public class Tab1 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
@Column(name = "tab1_id", updatable = false, nullable = false, columnDefinition = "uuid")
@Type(type = "org.hibernate.type.UUIDCharType")
private UUID tab1Id;
@Column(name = "name")
private String name;
....
您需要将其保存在数据库中吗?如果是这样的话,我想这是不可能的。但是如果你想在没有破折号的情况下检索它,只需执行实体的 getUUID 方法 class return 一个没有破折号的字符串。
您必须实施自定义 ID 生成器,并且您的实体将具有字符串 ID,因为它不再是有效的 UUID。
像这样的东西会起作用
@Id
@GenericGenerator(name = "mygen", strategy = "com.abc.generator.IdGenerator")
@GeneratedValue(generator = "mygen")
private String id;
您的生成器将如下所示:
package com.abc.generator;
import java.io.Serializable;
import java.util.UUID;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;
public class IdGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o)
throws HibernateException {
return UUID.randomUUID().toString().replace("-", "");
}
}