【问题标题】:Class not persistence?上课不坚持?
【发布时间】:2012-05-12 01:44:54
【问题描述】:

我试图在 GAE DB 中存储一个类,其中一些字段本身就是类。 就在进入更多细节之前,我想说在我添加这些新的类字段之前它工作得很好。 所以,我按照这里的文档:https://developers.google.com/appengine/docs/java/datastore/jdo/dataclasses 我收到了这个错误:

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

我尝试使用的主要类是 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
    @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
        }
    }

据我所知,每个类都是 PersistenceCapable 并且所有字段都是 PersistenceCapable 本身或它的集合,根据上面的文档,它应该可以工作。

想法?

谢谢

【问题讨论】:

  • "这意味着它要么没有被增强,要么文件的增强版本不在 CLASSPATH 中(或者被非增强版本隐藏),或者元数据/注释找不到类。”那么其中哪一个适用……因为肯定适用。您可以轻松检查 CLASSPATH 中的内容,以及是否增强(javap 告诉您类有哪些方法)

标签: java google-app-engine google-cloud-datastore jdo


【解决方案1】:

您尝试使用嵌入式类 Track 将 GeoPtr 的集合存储到 UserTracks。 DataStore 将如何处理它?当嵌入到 GeoPtr 的 UserTracks 字段中时,添加到 DataStore 中的常见单个记录。您将拥有:

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

DataStore 在收集情况下应该做什么?

avgSpeed, distance, ...., speed_1, time_1, ..., speed_2, time_2, ... speed_N, time_N

???

这有意义吗?

不要使用嵌入式。使用主键创建三个单独的类。对 User - UserTracks 使用一对一关系,对 UserTracks - GeoPtr 使用一对多关系。 阅读关系here

【讨论】:

  • 可以嵌入集合字段。我希望这个字段嵌入而不是在不同的表中。我不想要它,所以我可以在数据存储查看器中看到它们,它可以像普通对象一样保存它。无论如何,谢谢 :)
  • 您可以使其可序列化并写入 blob 字段。但可能还有其他问题:大小限制为 1MB。如果你的集合太大 - 你会得到一个例外
【解决方案2】:

显然,嵌入用户定义类的集合存在一些问题。 我在某处读到它不可能嵌入一个本身具有嵌入式集合字段的集合字段。但是,您可以通过序列化这些字段来实现几乎相同的效果(您将无法对它们进行索引 - 这是序列化与嵌入式之间的区别,但我不需要这些字段上的索引供我使用,所以效果很好)你可以通过使用下一个符号来做到这一点: @Persistent(serialized = "true")

希望它能帮大家减轻我所经历的痛苦。

酒吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2016-08-17
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多