1
    Collar collar = cat.getCollar();
    if(collar==null) {
        collar = new Collar(cat);
    }

    collar.setStuds(true);

    catDAO.mergeState(cat);

这抱怨collar 是一个瞬态对象,必须在刷新事务之前保存它。

我可以通过这样做来解决这个问题:

    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()如果需要)。

4

2 回答 2

0

您实际上是在尝试将 Cat 实体保留在 catDAO.mergeState(cat); 行中。

并且如果您已经在 Cat 实体中定义了 Cat 和 Collar 之间的关系(例如...@OneToMany 等)......那么如果您坚持 cat 它也将保存子实体项圈。

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

于 2013-03-02T14:45:47.980 回答
0

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

于 2013-03-02T14:41:12.663 回答