Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @如果Id字段为';什么是超类?_Java_Google App Engine_Objectify - Fatal编程技术网

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
}