Hibernate可以在更新父对象时保存新实体

时间:2013-03-02 14:34:18

标签: hibernate

    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()。)

2 个答案:

答案 0 :(得分:0)

不,它不应该,除非您的mergeState()方法调用merge()并且Cat和Collar之间的关联具有cascade = MERGE(或ALL)属性。

答案 1 :(得分:0)

您实际上是在尝试将Cat实体持久化 catDAO.mergeState(猫);

如果你已经定义了Cat&之间的关系(例如...... @OneToMany等) Cat实体中的衣领....然后,如果你坚持猫,它也会保存孩子实体衣领。

是的,您还应该配置级联(ALL等)