2013-04-13 57 views
1

我正在使用JDO嵌入實體。我已經通過this tutorial設置好了父母和子女實體。我的問題是,我似乎無法獲得對子實體進行的更改。這裏是我的兩個類:更新JDO嵌入實體字段

家長:

@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

我仍然愛一個更合理的答案,但對其他任何人爲此而努力,我沒有找到一個解決辦法:

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具有使嵌入式的完整副本目的。我假設有更好的方法,所以如果你知道一個,請分享。