Каскадное удаление в спящем режиме Не работает должным образом

Я использую hibernate 3 и пытаюсь удалить запись в базе данных, но удаление не работает так, как я ожидал. Схема гибернации работает против (в псевдокоде):

create table Employer(
    employer_id number(12) primary key,
    employer_name varchar2(50)
);

create table Employee(
    employee_id number(12) primary key,
    employee_name varchar2(50),
    employer_id number(12) foreign key references employer.employer_id not null
);

create table Employee_Roles(
    role_id number(12) primary key,
    employee_id number(12) foreign key references employee.employee_id not null,
    role varchar2(50)
);

Мои сопоставления классов гибернации выглядят примерно так:

@Entity
public class Employer{

    @Id
    @Column(name = "EMPLOYER_ID")
    private long id;

    @Column
    private String name;


    @OneToMany(targetEntity = Employee.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "employer_id")
    @Cascade(CascadeType.ALL)
    private Set<Employee> employees;
}

@Entity
public class Employee{

    @ManyToOne(targetEntity = Employer.class)
    @JoinColumn(name = "employer_id")
    @Cascade(value = CascadeType.SAVE_UPDATE)
    private Employer employer;

    @OneToMany(targetEntity = EmployeeRole.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "employee_id")
    @Cascade(CascadeType.ALL)
    private Set<Employee> employees;
}

@Entity
public class EmployeeRole{

    @ManyToOne(targetEntity = Employee.class)
    @JoinColumn(name = "employee_id")
    @Cascade(value = CascadeType.SAVE_UPDATE)
    private Employee employee;
}

Теперь с этой конфигурацией я вызываю:

getCurrentSession().delete(someEmployerEntity);

Происходит следующее:

Hibernate: update EMPLOYEE set EMPLOYEE_ID=null where EMPLOYEE_ID=?
Hibernate: update EMPLOYEE_ROLE set employee_id=null where employee_id==?
[2011-04-15 15:59:53,487] JDBCExceptionReporter WARN  - SQL Error: -10, SQLState: 23502
[2011-04-15 15:59:53,487] JDBCExceptionReporter ERROR - integrity constraint violation: NOT NULL check constraint; SYS_CT_10058 table: EMPLOYEE_ROLE

и возникает исключение. Я ожидаю, что в результате вызова session.remove (..) будет удалена запись работодателя, а также все записи сотрудников, связанные с работодателем, и все записи EmployeeRole, связанные с записями удаленных сотрудников. Это правильное предположение? Или я неправильно понимаю ключевую концепцию?

5
задан BuffaloBuffalo 15 April 2011 в 21:03
поделиться