【问题标题】:Save null value to many-to-one hibernate relationship error将空值保存到多对一休眠关系错误
【发布时间】:2011-10-13 03:39:16
【问题描述】:

我有两个课程 - 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对象的department值为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。当我尝试保存部门设置为空的人员实例时。 Department 中有 MIS、PURCHASING、ADMIN 和 MIS 4 条记录,person 实例保存,department 设置为新的 MIS 记录,不为空! 您是否有任何简单的多对一关系示例将 null 值保存到关系列?非常感谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    您所展示的内容不足以给出明确的答案。尝试创建一个SSCCE

    使用您显示的代码——除了它缺少一些重要的注释,我假设你只是在发布时省略了——如果你这样做,你会得到这个异常:

    Session session = ...
    Transaction tx = session.beginTransaction();
    Person person = new Person();
    person.setDepartment(new Department());
    session.save(person);
    tx.commit();
    

    由于您在 Person -> Department 关系上有 no cascading defined,因此您必须明确保存 Person 和 Department 才能使其正常工作。如果没有部门的保存,它是暂时的,不可能只使对象图的一部分持久化。

    【讨论】:

      【解决方案2】:

      您可能缺少@Cascade({CascadeType.SAVE_UPDATE})?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 2019-12-17
        • 2013-05-27
        相关资源
        最近更新 更多