更新JDK嵌入式实体字段

时间:2013-04-13 19:38:46

标签: google-app-engine jdo

我正在使用JDO嵌入式实体。我已经通过this tutorial设置了父和子实体。我的问题是,我似乎无法对子实体进行更改以保持持久性。这是我的两个班级:

父:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class TestEntity {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String name;

    @Persistent
    @Embedded
    private TestEntitySub sub;

    public TestEntitySub getSub() {
        return sub;
    }

    public void setSub(TestEntitySub sub) {
        this.sub = sub;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

子:

@PersistenceCapable
@EmbeddedOnly
public class TestEntitySub {
    @Persistent
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

要修改的代码:

PersistenceManager pm = PMF.get().getPersistenceManager();
TestEntity test = pm.getObjectById(TestEntity.class, 75L); //object has id=75
test.getSub().setState("New State");    
pm.makePersistent(test);
pm.close();

代码运行时没有错误,但数据存储区没有显示任何更改。我已经尝试了各种组合,同时保持子对象,重置父对象中的子字段等,没有任何效果。如果我修改了父亲的name而不是孩子的state,那就可以了。那么如何修改孩子的字段?

1 个答案:

答案 0 :(得分:1)

我仍然喜欢一个更合理的答案,但对于其他任何挣扎于此的人,我确实找到了解决方法:

PersistenceManager pm = PMF.get().getPersistenceManager();
TestEntity test = pm.getObjectById(TestEntity.class, 75L); //object has id=75
TestEntitySub sub = test.getSub();  //Get the embedded entity
sub = pm.detachCopy(sub);           //Make a detached copy
sub.setState("New State");          //Update it
test.setSub(sub);                   //set it as the new embedded entity
pm.makePersistent(test);            //and persist the parent
pm.close();

缺点是PM必须制作嵌入对象的完整副本。我假设有更好的方法,所以如果你知道一个,请分享。