我有两个班级之间的父子关系
父
@Entity
@Table(name = "PARENT")
public class Parent {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@Column(name = "WAGES")
private BigDecimal wages;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_ID")
private List<Child> children;
// getters and setters
}
子
@Entity
@Table(name = "CHILD")
public class Child{
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "PARENT_ID", nullable = false, insertable = false, updatable = false)
private Long parentId;
// getters and setters
}
在这种特殊情况下,父母没有子记录。当我更新父节点时,即使父节点不包含任何子记录而且我没有尝试更新/添加/删除任何子记录,hibernate也会抛出以下异常。在代码中,子集合根本不是访问。我正在使用所有JPA注释。 Hibernate版本是3.6.7.Final。任何指针都表示赞赏。
org.hibernate.HibernateException:拥有实体实例不再引用cascade =“all-delete-orphan”的集合:com.mycode.Child
//服务代码
public Parent update(ParentDto dto) {
Parent parent = parentDao.findById(dto.getId());
// Using Dozer to map dto object to entity object
// http://dozer.sourceforge.net/
dozerMapper.map(dto, parent);
taxFormW2Dao.saveOrUpdate(parent);
return Parent;
}
// Dao代码
public void saveOrUpdate(Parent parent){
// HibernateTempplate is injected through Spring
HibernateTemplate template = getHibernateTemplate();
getHibernateTemplate().saveOrUpdate(parent);
}
答案 0 :(得分:0)
我怀疑dozerMapper对集合做了些什么。尝试在不使用推土机的情况下将字段从DTO复制到实体。
此外,saveOrUpdate接受一个分离的实例,并将其附加到会话中。如果已在会话中加载已分离实体的附加版本,则会引发异常。
传递给saveOrUpdate
的父级已经附加,因此对saveOrUpdate
的调用完全没有必要(并且可能导致异常)。 Hibernate会自动保留对附加实体所做的更改。您无需致电saveOrUpdate
,update
或merge
。