2013-03-02 119 views
0
Collar collar = cat.getCollar(); 
    if(collar==null) { 
     collar = new Collar(cat); 
    } 

    collar.setStuds(true); 

    catDAO.mergeState(cat); 

這表示領圈是暫時的對象,並且在事務可以刷新之前必須保存領圈。在更新父對象時可以休眠保存新實體

我可以通過做解決這個問題:

if(collar==null) { 
     collar = new Collar(cat); 
     catDao.makePersistent(); 
    } 

這是正確的嗎? Hibernate不應該照顧爲我保留我的新實體嗎?

編輯:增加更多的細節。我使用Spring MVC的版本3.0.5和Hibernate 3

class Cat { 
     ... 
     @OneToOne(mappedBy="cat") 
     public Collar getCollar() { 
      return collar; 
     } 
     // etc 
    } 

    class Collar { 
     @OneToOne(optional = false, cascade = { CascadeType.PERSIST, 
      CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.LAZY) 
     @JoinColumn(name="CAT_ID", nullable = false) 
     public Cat getCat() { 
      return cat; 
     } 
     // etc 
    } 

在我的DAO的mergeState()方法調用entityManager.merge(cat)(和entityManager.flush()如果要求)。

回答

0

不,它不應該,除非您的mergeState()方法調用merge()並且Cat和Collar之間的關聯具有cascade = MERGE(或ALL)屬性。

+0

我會編輯我的問題,包括映射。我打算合併級聯 – carbontax 2013-03-02 20:58:13

+0

但是我確實在映射上有cascade = MERGE,我的mergeState調用確實調用merge()。我在上面添加了更多信息。有什麼遺漏嗎? – carbontax 2013-03-03 03:34:02

0

您實際上試圖堅持Cat實體在行 catDAO.mergeState(cat);

而且,如果您已經在Cat實體中定義了關係(例如... @OneToMany等)之間的關係......那麼如果您堅持貓,它也會保存子實體領。

是的,你應該也配置級聯(ALL等)

+0

我編輯了我的問題來表明這樣的映射確實存在,但我仍然必須在兩個步驟中完成。 – carbontax 2013-03-03 03:50:58

+0

級聯應該在'Cat.getCollar()'上。不在'Collar.getCat()'上。既然你叫貓合併,並希望它被級聯到它的衣領。 – 2013-03-03 07:39:23