在postgreSQL中将String保存为UUID

时间:2016-06-21 04:45:41

标签: hibernate postgresql uuid

我遇到了一个问题。在我的项目中,getter和setter的类型为STRING,对应列的SQL定义是UniqueIdentifier,它工作正常。例如:

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

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

但是当我们开始支持PostgreSQL DB时,我们使用定义UUID作为列类型迁移了所有表,其中它会抛出错误

我正在尝试保存字符,因为UUID要么强制转换它,要么更改列类型。

错误:

引起:org.postgresql.util.PSQLException:错误:列" uid"是uuid类型但表达式是字符变化的类型   提示:您需要重写或转换表达式。

我知道我必须将getter / setter更改为java.util.UUID类型的解决方案,但我们无法采用此解决方案,因为它需要在整个工作区中更改所有getter和setter。

我尝试了解决方案: HERE  表示我可以将UUID保存为String(DB列类型)但不解释如何将String保存为UUID(DB列类型)

我在Entity类中试过这个:

@Entity
@Table(name="emptest4")
public class Employee {

@Id
@Column(name="uid", columnDefinition = "UUID")
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String uid;

并在Hibernate.cfg.xml中:

 <property name="hbm2ddl.auto">create</property>

因此它会自动创建表格。我观察到创建的表是这样的:

CREATE TABLE public.emptest4
(
uid uuid NOT NULL,
name character varying(255),
CONSTRAINT emptest4_pkey PRIMARY KEY (uid)
)

但错误相同:(。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

Hibernate 5兼容JPA 2.1。您可以使用@AttributeConvertor作为第一个样本。关于它的好文章:How to implement a Converter?

但是对@Id列(你的第二个样本)不起作用。在这种情况下,最合理的方式(imho)是添加额外的getter / setter方法,并在字符串&lt; - &gt;之间进行转换。 uuid,并使用UUID作为ID数据类型

PS

我的想法:

click

答案 1 :(得分:0)

将字符串值转换为UUID,如下所示:

private val toForegroundHandler: Handler = Handler(Looper.getMainLooper())

@Synchronized
override fun toForeground(id: Int) {
    toForegroundHandler.removeCallbacksAndMessages(null)
    toForegroundHandler.postDelayed(16) {
        startForeground(id, builder.build())
    }
}

然后您可以传递ID值,它将起作用。