将空值保存为多对一休眠关系错误

时间:2011-10-13 03:39:17

标签: java hibernate

我有两个课程 - PersonDepartmentPersonDepartment之间存在多对一关系。

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值保存在关系列中?非常感谢。

2 个答案:

答案 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})?