2013-03-02 118 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