2013-10-18 25 views
1

我一個基類,只提供鑑定:擴展它喜歡@Id字段沒有看到,如果它是超類?

public abstract class Identifable<T> { 
    @Id 
    private T id = null; 

    public T getId() { 
     return id; 
    } 

    public void setId(T id) { 
     this.id = id; 
    } 

    public boolean hasId() { 
     return id != null; 
    } 
} 

和幾個子類:

@Entity 
@Cache 
public class MyEntity extends Identifable<String> { 
    /* some specific attributes and methods */ 
} 

我得到一個java.lang.IllegalStateException: @Id field 'id' in com.mypkg.MyEntity must be of type Long, long, or String

爲什麼?不能物化看到繼承的@Id字段? 謝謝

回答

3

原因:

Objectify僅在運行時使用反射檢查類型。由於type erasure所有無界類型參數在編譯過程中轉換爲Object類型,這是客觀化和投訴的目的。

解決辦法:

使用具體類型id場。按照@Anthony的建議,可能將其轉移到兒童班。

2

在JPA中,您必須使用以下類型之一標記爲@Id的字段: 任何Java基本類型;任何原始包裝類型; java.lang.String中; java.util.Date; java.sql.Date; java.math.BigDecimal的; java.math.BigInteger的

就從基類中刪除仿製藥,並使用上述類型之一的id字段。

+0

其實Alfredo,雖然註釋肯定看起來相同,但操作是使用[objectify](https://code.google.com/p/objectify-appengine/) –

+0

從objectify [文檔](https:// code.google.com/p/objectify-appengine/wiki/Entities): @Id字段可以是Long,long或String類型。如果您使用Long並保存具有空ID的實體,則使用此類標準GAE分配程序爲您生成一個數值。如果使用 字符串或原始長類型,則永遠不會自動生成值。 –

2

讓我們瞭解,如果一會兒......你試圖建立一個超類型,其中ID的類型變化的原因。你確定這是你想要物化的東西嗎(根實體有一個未知的ID類型的對象的層次結構)?雖然我已經在幾個ORM框架中看到過這種代碼,但這是我如何構建你想要的。

接口(而不是對象層次結構的一部分):

public interface Identifable<T> { 
    public T getId(); 
    public void setId(T id); 
    public boolean hasId(); 
} 

您hiearchy根實現Identifable一個具體類型的ID:

@Entity 
public class MyBaseClass implements Identifable<String> { 
    @Id 
    private String id = null; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public boolean hasId() { 
     return id != null; 
    } 
} 

和子順其自然出來的:

@EntitySubclass(index=true) 
public class MyEntity extends MyBaseClass { 
    // fields, accessors and mutators 
} 
相關問題