5

休止状態 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 レコードです。これは正しい仮定ですか?それとも、ここで重要な概念を誤解していますか?

4

1 に答える 1

4

Cascade all-delete-orphan は問題を解決するはずです。ただし、これは Hibernate の一部であり、EJB 標準ではありません。そうしたいと考えていて、ベンダーのソリューションにとらわれたくない場合は、この記事をご覧になることをお勧めします。

幸運を!

編集:あなたの提案に従って、所有関係を指定するために inverse="true" を使用する注釈方法と思われる @OneToMany 注釈に 'mappedBy' 属性を追加しました。関係の関連する変更されたセクションは次のようになります。

public class Employee{

    @OneToMany(targetEntity = EmployeeRole.class, mappedBy="employee", fetch = FetchType.EAGER,  cascadeType=CascadeType.ALL)
    private Set<EmployeeRole> employeeRoles;
}


public class Employer{

    @OneToMany(targetEntity = Employee.class, mappedBy="employer", fetch = FetchType.EAGER, cascadeType=CascadeType.ALL)
    private Set<Employee> employees;
}
于 2011-04-15T23:06:05.507 に答える