Java @如果Id字段为';什么是超类?
我有一个只提供标识的基类:Java @如果Id字段为';什么是超类?,java,google-app-engine,objectify,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 i
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;
}
}
公共抽象类可识别{
@身份证
私有T id=null;
公共T getId(){
返回id;
}
公共无效设置id(T id){
this.id=id;
}
公共布尔hasId(){
返回id!=null;
}
}
以及几个扩展它的子类,如:
@Entity
@Cache
public class MyEntity extends Identifable<String> {
/* some specific attributes and methods */
}
@实体
@缓存
公共类MyEntity扩展可识别{
/*一些特定的属性和方法*/
}
我得到一个java.lang.IllegalStateException:@Id字段“Id”在com.mypkg.MyEntity中必须是Long、Long或String类型
为什么??无法对象化查看继承的@Id
字段?
谢谢在JPA中,您必须对标有
@Id
的字段使用以下类型之一:
任何Java原语类型;任何原始包装类型;java.lang.String;java.util.Date;java.sql.Date;java.math.BigDecimal;java.math.biginger
只需从基类中删除泛型,并为您的id字段使用上述类型之一。在JPA中,您必须为标记有
@id
的字段使用以下类型之一:
任何Java原语类型;任何原始包装类型;java.lang.String;java.util.Date;java.sql.Date;java.math.BigDecimal;java.math.biginger
只需从基类中删除泛型,并为您的id字段使用上述类型之一。让我们来分析一下if的原因。。。您正试图构建一个ID类型不同的超级类型。您确定这是您想要objectify构建的(根实体具有未知ID类型的对象层次结构)?虽然我在几个ORM框架中见过这种代码,但这就是我如何构建您想要的 接口(不属于对象层次结构的一部分):
让我们考虑一下,如果有一段时间。。。您正试图构建一个ID类型不同的超级类型。您确定这是您想要objectify构建的(根实体具有未知ID类型的对象层次结构)?虽然我在几个ORM框架中见过这种代码,但这就是我如何构建您想要的 接口(不属于对象层次结构的一部分): 原因是: Objectify仅在运行时使用反射检查类型。因为所有的无界类型参数在编译期间都转换为
Object
type,这是objectify看到和抱怨的
解决方案:
为id
字段使用具体类型。可能会按照@Anthony的建议将其移动到子类。原因:
Objectify仅在运行时使用反射检查类型。因为所有的无界类型参数在编译期间都转换为Object
type,这是objectify看到和抱怨的
解决方案:
为
id
字段使用具体类型。可能会将其移动到@Anthony建议的子类。实际上是Alfredo,虽然注释看起来肯定相同,但op使用的是From objectify:@Id字段可以是Long、Long或String类型。如果使用Long并使用空id保存实体,则将使用此类的标准GAE分配器为您生成一个数值。如果使用String或原语long类型,将永远不会自动生成值。实际上,Alfredo虽然注释看起来肯定相同,但op使用的是From objectify:@Id字段可以是long、long或String类型。如果使用Long并使用空id保存实体,则将使用此类的标准GAE分配器为您生成一个数值。如果使用字符串或原语long类型,将永远不会自动生成值。
public interface Identifable<T> {
public T getId();
public void setId(T id);
public boolean hasId();
}
@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
}