2015-11-30 24 views
0

我有一个JBoss上托管工作的Java EE应用程序。它使用EclipseLink来管理Postgres数据库中的数据。我现在将实体类移动到单独的jar中,以便它们可以被其他组件共享。这样做后,Postgres给出以下错误:移动的EclipseLink实体到单独的jar

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. 

它看起来像我的转换器类没有被调用。这里是我的转换器类的样子:

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; 
    } 
} 

是否有某种配置的我失踪?

+0

奇怪的是,这会停止工作,并且您对layerId的转换器,但不是你的itemId。那是什么导致了错误的SQL?打开EclipseLink的日志记录,以最优秀的和工作日志进行比较的不工作的情况下,如在部署过程中一些警告可能表明缺少什么。 – Chris

+0

我加入转炉到的itemId,我停下得到错误。当我最初在不使用实体类的情况下在单独的jar中实现此代码时,只有在将UUID字段输入NULL时才需要转换器。因此,我只将转换器应用于可空的UUID字段。看起来EclispeLink现在需要在所有UUID字段中使用转换器。 –

回答

0

它看起来像这个问题是一个现在看来很明显。我需要将Convert注解应用于所有UUID字段。

以前我只加了注释转换可空UUID字段,因为Postgres的只是吓唬当UUID领域分别设置为NULL我键入错误。现在,Postgres为所有没有Convert注解的UUID字段抛出异常。

相关问题