我想使用PostgreSQL uuid类型作为对象的主键。为此我创建了一个转换器(实现了Converter接口)。下面是相关代码:
@Override
public void initialize(DatabaseMapping mapping, Session session) {
final DatabaseField field;
if (mapping instanceof DirectCollectionMapping) {
field = ((DirectCollectionMapping) mapping).getDirectField();
} else {
field = mapping.getField();
}
field.setSqlType(Types.OTHER);
field.setTypeName("uuid");
field.setColumnDefinition("UUID");
}
然后,我用下面的注解对相关实体X进行了注解:
@Converter(name="uuidConverter",converterCalss=UUIDConverter.class)
@Convert("uuidConverter")
@Id
public UUID getId()
{
return id;
}
问题是我有另一个类(Y),它有以下定义:
@ManyToOne(targetEntity = X.class)
@JoinColumn(name = "x_id")
public X getX();
尽管EclipseLink按预期创建了表,但在尝试插入Y类型的对象时,它会向数据库发送一个字符串。Postgres返回以下错误消息:
column "id" is of type uuid but expression is of type character varying at character
任何解决方案/变通方案都将受到赞赏。
6条答案
按热度按时间sgtfey8w1#
我在使用EclipseLink JPA + Postgresql + UUID作为主键时遇到了同样的问题。
为了解决这个问题,我合并了Github和下面链接的代码:https://forums.oracle.com/forums/thread.jspa?messageID=4584157
下面的UUIDConverter代码对我很有效,尽管这段代码肯定不是最好的。
de90aj5v2#
我在使用EclipseLink JPA 2.1 + Postgresql + UUID作为主键时遇到了一些问题,但我找到了不同的解决方案。我采用了AttributeConverter,但我在EclipseLink实现中遇到了一个问题,我用以下代码解决了这个问题:
正如我在这篇文章中详细解释的那样http://blog-ungarida.rhcloud.com/persisting-uuid-in-postgresql-using-jpa-eclipselink/
tmb3ates3#
尝试检查initialize方法中Map的fieldClassification是什么。它可能以某种方式获取了String.class,尝试将其设置为Object.class。
或字段.setType(对象.类别)
72qzrwbm4#
EclipseLink和PostgresQL之间似乎存在bug/不兼容。如果你只是使用UUID作为主键,你应该没问题。但是如果你有一个可以为空的UUID列,并且你试图在其中存储空值,你会得到报告的错误:
请看:https://bugs.eclipse.org/bugs/show_bug.cgi?id=538138(如果你有时间的话,请登录并为它投票!)
这个错误报告对我非常有用。特别是论坛线程的链接:
https://www.eclipse.org/forums/index.php?t=msg&th=1073632&goto=1719530&#msg_1719530
我在SO上尝试了各种各样的解决方案,在Web上的其他地方也尝试了各种各样的解决方案。唯一一个似乎对我有效的是大卫惠勒在那里发布的解决方案。具体来说,就是在数据库中创建一个从
character varying
到uuid
的转换。请注意,您必须是postgres用户才能创建转换:
为了完整起见,这里是我使用的其余部分(如果有帮助的话)
我的所有实体(具有UUID主键)都扩展了一个名为
EntityBase
的基类:UUID转换器类如下所示:
如果实体得UUID列不是主键,则可以按如下方式对其进行注解:
请注意,如果该实体有其他使用标准
javax.persistence.convert
注解的列,则需要区分这两个Convert
注解以避免编译错误。例如:
希望这能为别人节省一些时间,祝你好运!
xfb7svmp5#
适用于EclipseLink的通用UUID转换器(不仅适用于PostgreSQL)
代码:
ftf50wuq6#
您不需要转换的。请在实体中使用此列定义。您需要首先注册uuid扩展名。这适用于Postgres 10和Wildfly 10.1