我有两个课程 - Person
和Department
。 Person
和Department
之间存在多对一关系。
public class Person {
private Integer id;
private String name;
private Department department;
@ManyToOne(fetch=FetchType.EAGER, optional=true, targetEntity=Department.class)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(name="department", referencedColumnName="id", nullable=true, insertable=false, updatable=true)
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
// other getter and setter
}
public class Department {
private Integer id;
private String name;
// other getter and setter
}
程序通过调用
来保存Person
对象
getHibernateTemplate().saveOrUpdate(person);
在保存之前设置Person
对象的部门值时,程序运行正常。如果保存之前Person
对象的部门值为null,则会出现以下错误:
对象引用未保存的瞬态实例 - 保存瞬态 刷新前的实例:webmodule.model.Department;嵌套异常 是org.hibernate.TransientObjectException:对象引用一个 未保存的瞬态实例 - 保存之前的瞬态实例 刷新:webmodule.model.Department
多对一关系是否遗漏了任何设置?请指教,谢谢。
我已经定义了Struts2 + Spring + Hibernate,并通过调用
保存了person实例getHibernateTemplate().saveOrUpdate(person);
我已经尝试添加
@org.hibernate.annotations.Cascade
({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
但是当将null保存为多对一关系时,这将自动在Department中创建一个额外的记录!
例如,我在Department中有3个MIS,PURCHASING和ADMIN记录,而person实例最初保存为MIS。当我尝试将部门设置为null的人员实例保存时。部门中有4条记录MIS,PURCHASING,ADMIN和MIS,人员实例以部门设置保存为新的MIS记录,不为空!
您是否有任何简单的多对一关系样本,其null
值保存在关系列中?非常感谢。
答案 0 :(得分:3)
你所展示的内容还不足以给出明确的答案。尝试创建SSCCE。
使用您显示的代码 - 除了它缺少一些重要的注释,我假设您在发布时只是省略了 - 如果您这样做,您会得到该异常:
Session session = ...
Transaction tx = session.beginTransaction();
Person person = new Person();
person.setDepartment(new Department());
session.save(person);
tx.commit();
由于您对此人有no cascading defined - >部门关系,您必须明确保存人员和部门才能工作。没有Department的保存,它是瞬态的,并且不可能只使对象图的一部分持久化。
答案 1 :(得分:0)
可能你错过了@Cascade({CascadeType.SAVE_UPDATE})?