java - 将空值保存到多对一 hibernate 关系错误

标签 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 时,出现以下错误:

object references an unsaved transient instance - save the transient instance before flushing: webmodule.model.Department; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: 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 中创建一条附加记录!

例如,我在部门中有3条记录MIS、PURCHASING和ADMIN,而人员实例最初保存为MIS。当我尝试保存部门设置为空的人员实例时。部门中有 4 条记录 MIS、PURCHASING、ADMIN 和 MIS,人员实例与部门设置一起保存为新的 MIS 记录,不为空! 您是否有任何简单的多对一关系示例,其中 null 值保存到关系列?非常感谢。

最佳答案

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

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

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

既然你有no cascading defined对于“人员 -> 部门”关系,您必须显式保存“人员”和“部门”才能使其正常工作。如果没有 Department 的保存,它是暂时的,并且不可能仅使对象图的一部分持久化。

关于java - 将空值保存到多对一 hibernate 关系错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7749208/

相关文章:

java - 如何为tomcat服务器上运行的不同项目获取多个控制台?

java多线程模板基准测试

oracle - 没有更多数据可以从套接字错误中读取

java - 使用 SQL 查询的基本 Hibernate 问题

java - Spring Boot 连接两个具有无效 FK 条目的实体

java - 在使用 Hibernate 4 时, `org.hibernate.cache.EhCacheProvider` 需要什么依赖项?

Java MergeSort - 内存不足错误 : Java Heap Space

java - Set返回值但Get返回null

java - 当java数组越界时抛出错误

java - 禁用 Hibernate 日志记录,显示 sql false 不起作用