Java TransientObject异常,即使我设置了cascade=CascadeType.ALL
我有两门课: Employee.javaJava TransientObject异常,即使我设置了cascade=CascadeType.ALL,java,hibernate,Java,Hibernate,我有两门课: Employee.java @Entity @Table public class Employee { @Id @GeneratedValue private Long id; private String name; @ManyToOne private Department department; public Employee() {} public Employee(String name, Depa
@Entity
@Table
public class Employee {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
private Department department;
public Employee() {}
public Employee(String name, Department department) {
this.name = name;
this.department = department;
}
public Employee(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", department="
+ department.getName() + "]";
}
}
@Entity
@Table
public class Department {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy="department",cascade=CascadeType.ALL)
private List<Employee> employees = new ArrayList<Employee>();
public Department() {
super();
}
public Department(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Department.java
@Entity
@Table
public class Employee {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
private Department department;
public Employee() {}
public Employee(String name, Department department) {
this.name = name;
this.department = department;
}
public Employee(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", department="
+ department.getName() + "]";
}
}
@Entity
@Table
public class Department {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy="department",cascade=CascadeType.ALL)
private List<Employee> employees = new ArrayList<Employee>();
public Department() {
super();
}
public Department(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
它不起作用。它抛出了一个错误:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.learn.hibernate.Department
但是如果我取消了session.save(department)行的注释代码>,一切正常。为什么?我已经设置了
cascade=CascadeType.ALL
,所以它应该自动保存部门
,而不会抛出任何错误。我错过什么了吗?你的级联在部门上。这意味着您需要使用添加的Employee
实例保存Department
实例。员工将被解救
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Department department = new Department("java");
deparmtment.getEmployees().add(new Employee("Jakab Gipsz",department));
deparmtment.getEmployees().add(new Employee("Captain Nemo",department));
session.save(department);
session.getTransaction().commit();
这是因为您在字段初始值设定项中创建了Employee
,因此如果它没有被托管的Employee
实例覆盖,Hibernate会将其视为瞬态,并在刷新时抛出异常
解决方案不是在字段初始值设定项中创建它:
@OneToMany(mappedBy="department",cascade=CascadeType.ALL)
private List<Employee> employees;
保存员工时,不会保存部门,因为没有级联。如果需要,需要在Employee类中添加级联
@ManyToOne(cascade = CascadeType.save)
private Department department;