我遇到了一个问题。在我的项目中,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)
)
但错误相同:(。
任何帮助都将不胜感激。
答案 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值,它将起作用。