Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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 类不是持久性?_Java_Google App Engine_Google Cloud Datastore_Jdo - Fatal编程技术网

Java 类不是持久性?

Java 类不是持久性?,java,google-app-engine,google-cloud-datastore,jdo,Java,Google App Engine,Google Cloud Datastore,Jdo,我试图在GAEDB中存储一个类,它的一些字段本身就是类。 在讨论更多细节之前,我想说,在添加这些新类字段之前,它工作得很好。 因此,我遵循了这里的文档: 我得到一个错误: org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException:类sporteam.web.client.User的类不可持久化。这意味着它要么没有被增强,要么文件的增强版本不在类路径中,要么被未增强版本隐藏,或者找不到类的元数据/注释。是不持久的。这意味着

我试图在GAEDB中存储一个类,它的一些字段本身就是类。 在讨论更多细节之前,我想说,在添加这些新类字段之前,它工作得很好。 因此,我遵循了这里的文档: 我得到一个错误:


org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException:类sporteam.web.client.User的类不可持久化。这意味着它要么没有被增强,要么文件的增强版本不在类路径中,要么被未增强版本隐藏,或者找不到类的元数据/注释。是不持久的。这意味着它或者没有被增强,或者文件的增强版本不在类路径中,或者被未增强版本隐藏,或者找不到类的元数据

我尝试使用的主要类是User:

@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable 
{
    // data members

    // user unique facebook id
    @Persistent
    @PrimaryKey
    private String facebook_id;

    // users facebook code
    @Persistent
    private String facebook_code;

    // users device ID code
    @Persistent
    private String dev_id;

    // users registration ID code
    @Persistent
    private String reg_id;

    // user first name
    @Persistent
    private String first_name;

    // user last name
    @Persistent
    private String last_name;

    // user age, should be grater then 8
    @Persistent
    private int age;

    // user email, as setup in facebook
    @Persistent
    private String email;

    // user weight, should be greater then 40
    @Persistent
    private double weight;

    // user workout_level (0.8 is the highest(best shape) and 1 is the lowest)
    @Persistent
    private double workout_level;

    // user gender ("male"/"female"/"unknown")
    @Persistent
    private String gender;
    @Persistent
    @Embedded
    private UserTracks userTracks = null;

    // default constructor
    public User() 
    {
    }
    //....
}
这是UserTracks类:

    @PersistenceCapable
    @EmbeddedOnly
    @SuppressWarnings("serial")
    public class UserTracks implements Serializable 
    {
        @Persistent
        @Embedded
        //@Element(embedded="true") 
        private List<Track> tracks = null;
        @Persistent
        private long date = 0;

        public UserTracks() 
        {
        }
    }
就我所见,每个类都是PersistenceCapable的,所有字段要么本身就是PersistenceCapable的,要么就是PersistenceCapable的集合,根据上面的文档,它应该可以工作

想法


谢谢

很显然,嵌入用户定义类的集合会有一些问题。 我在某个地方读到,不可能嵌入一个本身具有嵌入集合字段的集合字段。但是,通过序列化这些字段,您可以实现几乎相同的效果—您将无法为它们编制索引—这是序列化为嵌入式的区别,但我不需要这些字段上的索引供我使用,因此效果很好—您可以使用下一个表示法: @Persistentserialized=true

希望它能帮你们所有人摆脱我所经历的痛苦


条。

您尝试使用嵌入式类Track将GeoPtr集合存储到UserTracks。数据存储将如何处理它?当嵌入到UserTracks时,GeoPtr的字段添加到数据存储中的公共单记录中。你将有:

平均速度、距离、速度、时间

在收集案例中,数据存储应该做什么

平均速度,距离,…,速度1,时间1,…,速度2,时间2。。。速度,时间

这有意义吗

不要使用嵌入式。使用主键创建三个单独的类。用户-用户轨迹使用一对一关系,用户轨迹-GeoPtr使用一对多关系。
阅读关于关系的文章

这意味着它要么没有被增强,要么文件的增强版本不在类路径中,要么被未增强的版本隐藏,或者找不到类的元数据/注释。那么哪一个适用于。。。因为一个人肯定是这样。您可以很容易地检查类路径中有什么,以及增强的javap是否告诉您类有哪些方法可以嵌入集合字段。我希望将此字段嵌入,而不是放在不同的表中。我不想要它,所以我可以在数据存储查看器中看到它们,它可以像普通对象一样保存它,不管怎样,谢谢你:你可以将它序列化并写入blob字段。但可能还有其他问题:大小限制为1MB。如果你的收藏太多,你会得到一个例外
    @PersistenceCapable
    @EmbeddedOnly
    @SuppressWarnings("serial")
    public class Track implements Serializable 
    {

        /** running information **/
        @Persistent
        private double avgSpeed = 0;
        @Persistent
        private double distance = 0;
        @Persistent
        private double calories = 0;
        @Persistent
        private long time = 0;

        /************************/
        @Persistent
        private long date = 0;
        @Persistent
        private String name = null;
        @Persistent
        @Embedded
        private List<GeoPtr> track = null;

        public Track() 
        { // needed for Serializable
        }
    }
    @PersistenceCapable
    @EmbeddedOnly
    @SuppressWarnings("serial")
    public class GeoPtr implements Serializable 
    {

        /** the speed is in m/s **/
        @Persistent
        float speed;
        @Persistent
        long time;
        @Persistent
        double altitude;
        @Persistent
        double latitude;
        @Persistent
        double longitude;
        @Persistent
        double calorie = 0;

        public GeoPtr()
        {   //needed for Serializable
        }
    }