我有一个只提供身份识别的基类:
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
字段?
感谢
答案 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
}