将 Eclipselink 实体移动到单独的 jar
Moving Eclipselink Entities to separate jar
我有一个正在运行的 Java EE 应用程序托管在 JBoss 上。它使用 EclipseLink 来管理 Postgres 数据库中的数据。我现在将实体 classes 移动到一个单独的 jar 中,以便它们可以被其他组件共享。这样做之后,Postgres 给出了以下错误:
ERROR: operator does not exist: uuid = bytea at character 209
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
我的转换器 class 似乎没有被调用。这是我的转换器 class 的样子:
package model.util;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.sessions.Session;
import java.sql.Types;
import java.util.UUID;
public class PgUuidConverter
implements Converter
{
@Override
public boolean isMutable ()
{
return false;
}
@Override
public Object convertDataValueToObjectValue (Object value, Session session)
{
return (UUID) value;
}
@Override
public Object convertObjectValueToDataValue (Object value, Session session)
{
return (UUID) value;
}
@Override
public void initialize (DatabaseMapping mapping, Session session)
{
mapping.getField ().setSqlType (Types.OTHER);
}
}
下面是我在我的实体中使用它的方式:
package model;
import model.util.PgUuidConverter;
import org.eclipse.persistence.annotations.Convert;
import org.eclipse.persistence.annotations.Converter;
import java.util.UUID;
import javax.persistence.*;
@Entity
@Table (
name = "item",
schema = "main"
)
@Converter (
name = "uuid",
converterClass = PgUuidConverter.class
)
public class Item
{
public Item () {}
@Id
@Column (
name = "item_id",
unique = true,
nullable = false
)
private UUID itemId;
@Column (name = "layer_id")
@Convert ("uuid")
private UUID layerId;
public UUID getItemId ()
{
return this.itemId;
}
public UUID getLayerId ()
{
return this.layerId;
}
public void setItemId (UUID itemId)
{
this.itemId = itemId;
}
public void setLayerId (UUID layerId)
{
this.layerId = layerId;
}
}
是否缺少某种配置?
看来这个问题现在很明显了。我需要将 Convert 注释应用于所有 UUID 字段。
之前我只将 Convert 注释应用于可为空的 UUID 字段,因为 Postgres 仅在 UUID 字段设置为 NULL 时给我类型错误。现在 Postgres 正在为所有没有 Convert 注释的 UUID 字段抛出异常。
我有一个正在运行的 Java EE 应用程序托管在 JBoss 上。它使用 EclipseLink 来管理 Postgres 数据库中的数据。我现在将实体 classes 移动到一个单独的 jar 中,以便它们可以被其他组件共享。这样做之后,Postgres 给出了以下错误:
ERROR: operator does not exist: uuid = bytea at character 209
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
我的转换器 class 似乎没有被调用。这是我的转换器 class 的样子:
package model.util;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.sessions.Session;
import java.sql.Types;
import java.util.UUID;
public class PgUuidConverter
implements Converter
{
@Override
public boolean isMutable ()
{
return false;
}
@Override
public Object convertDataValueToObjectValue (Object value, Session session)
{
return (UUID) value;
}
@Override
public Object convertObjectValueToDataValue (Object value, Session session)
{
return (UUID) value;
}
@Override
public void initialize (DatabaseMapping mapping, Session session)
{
mapping.getField ().setSqlType (Types.OTHER);
}
}
下面是我在我的实体中使用它的方式:
package model;
import model.util.PgUuidConverter;
import org.eclipse.persistence.annotations.Convert;
import org.eclipse.persistence.annotations.Converter;
import java.util.UUID;
import javax.persistence.*;
@Entity
@Table (
name = "item",
schema = "main"
)
@Converter (
name = "uuid",
converterClass = PgUuidConverter.class
)
public class Item
{
public Item () {}
@Id
@Column (
name = "item_id",
unique = true,
nullable = false
)
private UUID itemId;
@Column (name = "layer_id")
@Convert ("uuid")
private UUID layerId;
public UUID getItemId ()
{
return this.itemId;
}
public UUID getLayerId ()
{
return this.layerId;
}
public void setItemId (UUID itemId)
{
this.itemId = itemId;
}
public void setLayerId (UUID layerId)
{
this.layerId = layerId;
}
}
是否缺少某种配置?
看来这个问题现在很明显了。我需要将 Convert 注释应用于所有 UUID 字段。
之前我只将 Convert 注释应用于可为空的 UUID 字段,因为 Postgres 仅在 UUID 字段设置为 NULL 时给我类型错误。现在 Postgres 正在为所有没有 Convert 注释的 UUID 字段抛出异常。