AppEngine - 相同类型的多个关系

时间:2011-06-11 17:22:43

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

我需要两个相同类型的对象。默认情况下,appengine不允许它,但是我找到了这个参数:datanucleus.appengine.allowMultipleRelationsOfSameType,所以我可以保存两个相同类型的对象。

在调试模式下,在调用makePersistent方法之前,我检查了每个对象中的值并且它们是不同的,但是,当我尝试从数据存储区恢复值时,它们是相同的。两者都有第二个对象的值?

此代码用于保存对象FaseGAE:

manager = GAEDAOFactory.get().getPersistenceManager();
Key faseKey = KeyFactory.stringToKey(grupo.getFaseKey());
FaseGAE faseGAE = manager.getObjectById(FaseGAE.class, faseKey);
faseGAE.addGrupoGAE(grupoGAE);
faseGAE = manager.makePersistent(faseGAE);
manager.close();

此代码用于获取对象:

manager = GAEDAOFactory.get().getPersistenceManager();
FaseGAE faseGAE2 = manager.getObjectById(FaseGAE.class, faseKey);

FaseGAE对象:

@PersistenceCapable
public class FaseGAE {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent private List<GrupoGAE> grupos;

GrupoGAE对象:

@PersistenceCapable
public class GrupoGAE {

    @PrimaryKey
    @Persistent (valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent private List<MyClass1> list;

MyClass1对象:

@PersistenceCapable
public class MyClass1 {

    @PrimaryKey
    @Persistent (valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent private MyClass2 sameTypeObject1;
    @Persistent private MyClass2 sameTypeObject2;
    @Persistent private String testValue1;
    @Persistent private String testValue2;

MyClass2对象:

@PersistenceCapable
public class MyClass2{

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

testValue1和testValue2保持不同的值,但sameTypeObject1和sameTypeObject2的值为sameTypeObject2。我检查了数据存储区,并且使用不同的值创建了两个对象。似乎两者都指向相同的参考。

我做错了吗? 使用相同类型的关系时缺少什么东西?
绝对AppEngine不允许相同类型的关系吗?

1 个答案:

答案 0 :(得分:1)

之前我遇到过类似的问题,我不太确定你的确切问题是什么,以及它是否相同。但希望这个答案至少能指出你正确的方向

但是,在使用带GAE的java时,可以采用一些“最佳实践”。

1)为类实现Serializable 即公共类FaseGAE实现Serializable - 这将使持久的有能力的类能够与会话对象一起存储和检索。

2)您可以尝试使用objectify进行GAE数据存储 http://code.google.com/p/objectify-appengine/