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 :(得分:0)
不,它不应该,除非您的mergeState()
方法调用merge()
并且Cat和Collar之间的关联具有cascade = MERGE
(或ALL
)属性。
答案 1 :(得分:0)
您实际上是在尝试将Cat实体持久化 catDAO.mergeState(猫);
如果你已经定义了Cat&之间的关系(例如...... @OneToMany等) Cat实体中的衣领....然后,如果你坚持猫,它也会保存孩子实体衣领。
是的,您还应该配置级联(ALL等)