2011-05-10 7 views
1

私は2つのオブジェクトを持っています。会社と従業員にしましょう。それから私は、すべての従業員を持つ企業を削除したいHibernateで相互に関連するオブジェクトを削除する方法

class Employee { 
    long id; 
    String name; 
    Company company; 
} 

class Company{ 
    long id; 
    String name; 
    Employee chief; 
} 

CREATE TABLE company (
    company_id BIGINT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL, 
    chief_id BIGINT(20) NOT NULL, 
    PRIMARY KEY (company_id), 
    CONSTRAINT fk_company_chief 
    FOREIGN KEY (chief_id) 
    REFERENCES employee (employee_id) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION); 

CREATE TABLE employee(
    employee_id BIGINT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL, 
    company_id BIGINT(20) NOT NULL, 
    PRIMARY KEY (employee_id), 
    CONSTRAINT fk_employee_company 
    FOREIGN KEY (chief_id) 
    REFERENCES employee (company_id) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION); 

そして、私のクラスは次のようになり。私は1回の取引でそれを行います。私のようなものが得られる"java.sql.BatchUpdateException: Column 'chief_id' cannot be null"

カラムの1つをヌル可能にした後でしか削除できません。例えば ​​"chief_id BIGINT(20)NULL"のようにしてから、削除する前にcompany.chief = nullにします。

私たちはHibernateカスケードを使用せず、データベースカスケードを変更することはできません。

MySql 5.0を使用しています。

私は、以下のようにsmthが必要です:disable constraints-> remove entity-> enable constraints。無効状態は、現在のトランザクション内でのみアクセス可能である必要があります。私はそれがデフォルトの動作だと思った。

+0

ここでJPAアノテーションを指定していないのですが、その関係は何ですか?*(Company - Employee)、POJOのIDを超えて定義されたアノテーションに対してnullable = trueを追加できますか? – Narayan

答えて

0

休止状態のカスケードを使用する必要があります。データベース制約の無効/有効化はDDL操作であり、すぐにコミットされます。他のトランザクションコンテキストから「無効状態」を隠す方法はありません。

1

DBMSがサポートしている場合は、制約の1つをdeferrable initially deferredと宣言して、トランザクションの最後にチェックされるようにすることができます。

+0

私はあなたのソリューションが好きです!しかし、私たちはMySQL 5.0を使用しており、私はそれを使用することはできません。どうも! – Zalivaka

+0

MySqlがすぐにチェックを実行すると、この相互に関連するデータがどのように保存されるのだろうか? – Zalivaka

0

Hibernateカスケードを使用できない場合は、ダミー会社(たとえばcompany_id = -1)とダミーチーフEmployeeオブジェクト(employee_id = -1)を使用します。 DummyChiefはDummyCompany社に属し、DummyCompanyの責任者はDummyChiefです。

その後、次の順序で進めることができます:

1 /会社内のすべての非チーフ従業員を削除します。

2/DummyChiefに、当社チーフ従業員を設定します(EMPLOYEE_ID = -1)

3 /チーフ従業員を削除します。

4 /会社を削除します。

関連する問題