2015-09-30 24 views
0

我有兩類:TransientObjectException即使我設置級聯= CascadeType.ALL

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() + "]"; 
    } 

} 

Department.java

@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; 
    } 
} 

然後我試圖在主要方法中保存departmentemployees

Session session = HibernateUtil.getSessionFactory().openSession(); 
session.beginTransaction(); 

Department department = new Department("java"); 
//session.save(department); //throw org.hibernate.TransientObjectException if I comment the line 

session.save(new Employee("Jakab Gipsz",department)); 
session.save(new Employee("Captain Nemo",department)); 

session.getTransaction().commit(); 

它沒有工作。它扔了一個錯誤:

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,所以它應該自動保存department而不會引發任何錯誤。我錯過了什麼嗎?

回答

1

當您保存一個僱員,該部不會被保存因爲沒有級聯。如果你想這樣做,你需要在Employee類中添加一個級聯。

@ManyToOne(cascade = CascadeType.save) 
private Department department; 
1

您的級聯在Department。這意味着,您需要保存Department實例並添加Employee實例。員工將得到保存。

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(); 
0

這是因爲你在場上初始化創建Employee,所以如果不與管理Employee實例覆蓋時,Hibernate將其視爲短暫的,在拋出沖洗時間除外。

的解決方案是無法在現場初始化來創建它:

@OneToMany(mappedBy="department",cascade=CascadeType.ALL) 
private List<Employee> employees; 

你也必須遵循詹姆斯答案

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(); 
相關問題