我想为对象的主键使用 PostgreSQL uuid 类型。 为此,我创建了一个转换器(实现 Converter 接口(interface))。 相关代码如下:
@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
任何解决方案/解决方法将不胜感激。
最佳答案
我在使用 EclipseLink JPA + Postgresql + UUID 作为主键时遇到了同样的问题。
为了解决这个问题,我合并了 Github 和下面链接中的代码: https://forums.oracle.com/forums/thread.jspa?messageID=4584157
下面的 UUIDConverter 代码对我有用,尽管代码肯定不是最好的。
public void initialize(DatabaseMapping ARGMapping, Session ARGSession)
{
final DatabaseField Field;
if (ARGMapping instanceof DirectCollectionMapping)
{
Field = ((DirectCollectionMapping) ARGMapping).getDirectField();
}
else
{
Field = ARGMapping.getField();
}
Field.setSqlType(Types.OTHER);
Field.setTypeName("uuid");
Field.setColumnDefinition("UUID");
for (DatabaseMapping m : ARGMapping.getDescriptor().getMappings())
{
assert OneToOneMapping.class.isAssignableFrom(ManyToOneMapping.class);
if (m instanceof OneToOneMapping)
{
for (DatabaseField field : ((OneToOneMapping) m).getForeignKeyFields())
{
field.setSqlType(Types.OTHER);
field.setColumnDefinition("UUID");
field.setTypeName("uuid");
}
}
}
}
关于java - 将 UUID 与 EclipseLink 和 PostgreSQL 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13346089/