Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TransientObject异常,即使我设置了cascade=CascadeType.ALL_Java_Hibernate - Fatal编程技术网

Java TransientObject异常,即使我设置了cascade=CascadeType.ALL

Java 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

我有两门课:

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, 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;