如何在GAE中将项添加到实体的1-N属性

时间:2012-08-20 15:18:56

标签: google-app-engine jdo datanucleus

我有实体个人资料,喜欢和放置

地方有喜欢。 喜欢参考地点和简介。

地方有喜欢的1-N关系

@PersistenceCapable
public class Place {

    @Persistent(mappedBy = "place")
    @Element(dependent = "true")
    private transient List<Like> likes;  

喜欢引用Profile并引用Place

@PersistenceCapable
public class Like implements Serializable {

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

    @Persistent
    private Profile profile;    

    @Persistent
    private Place place;

并且个人资料类与此对象没有关系

@PersistenceCapable
public class Profile {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private transient Key key;

添加Like以使用现有个人资料放置现有位置的最佳方法是什么?

我使用以下代码执行此操作:

    Profile profile;
    Place place;
    List<Like> likes;
    pm = PMF.get().getPersistenceManager();
    try {   
        place = pm.getObjectById(Place.class, placeId);
        likes = place.getLikes();
        profile = pm.getObjectById(Profile.class, KeyFactory.createKey(Profile.class.getSimpleName(), login));
    } finally {
        pm.close();
    }

    likes.add(new Like(place, profile));
    place.setLikes(likes);

    pm = PMF.get().getPersistenceManager();
    try {   
        pm.makePersistent(place);
    } finally {
        pm.close();
    }   

并且具有Profile实体的副本。有办法解决吗?

1 个答案:

答案 0 :(得分:1)

为什么要解决在事务中检索对象的所有问题,然后关闭PM(因此,根据JDO规范,对象变为瞬态)如果您要添加一个新的Like喜欢Place?只会说

会更有意义
place.getLikes().add(new Like(place, profile));

仍在交易中。实际上,阅读关于对象生命周期应该是使用任何持久性规范(JDO或JPA)的任何人的先决条件。显然,上述内容并非特定于GAE。