2015-11-30 29 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字段拋出異常。

相關問題