我正在使用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
,那就可以了。那么如何修改孩子的字段?
答案 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必须制作嵌入对象的完整副本。我假设有更好的方法,所以如果你知道一个,请分享。