@Id字段没有看到它是否在超类中?

时间:2013-10-18 14:47:07

标签: java google-app-engine objectify

我有一个只提供身份识别的基类:

    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

为什么呢?不能Objectify看到继承的@Id字段? 感谢

3 个答案:

答案 0 :(得分:3)

原因:

Objectify仅在运行时使用反射检查类型。由于type erasure所有无界类型参数在编译期间都转换为Object类型,这就是客观化和抱怨的内容。

解决方案:

id字段使用具体类型。根据@Anthony的建议,可能会把它移到儿童班。

答案 1 :(得分:2)

在JPA中,您必须使用标有@Id以下类型之一的字段: 任何Java原始类型;任何原始包装类型; java.lang.String中; java.util.Date; java.sql.Date; java.math.BigDecimal的; java.math.BigInteger中

只需从基类中删除泛型,并为id字段使用上述类型之一。

答案 2 :(得分:2)

让我们了解一段时间......您正在尝试构建一个ID类型不同的超类型。您确定这是您想要构建的对象(根实体具有未知ID类型的对象层次结构)吗?虽然我在几个ORM框架中看到过这种代码,但这就是我如何构建你想要的东西。

接口(不是对象层次结构的一部分):

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

你的hiearchy的root实现了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
}