Java 类不是持久性?
我试图在GAEDB中存储一个类,它的一些字段本身就是类。 在讨论更多细节之前,我想说,在添加这些新类字段之前,它工作得很好。 因此,我遵循了这里的文档: 我得到一个错误: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的类不可持久化。这意味着它要么没有被增强,要么文件的增强版本不在类路径中,要么被未增强版本隐藏,或者找不到类的元数据/注释。是不持久的。这意味着
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
}
}