2009-07-03 21 views
2

私はこれらのクラスを持っています。1対1の関係を削除

@Entity 
@Table(name ="a") 
class A{ 
    private Integer aId; 
    private B b; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id_a") 
    public Integer getAId() { 
return aId; 
    } 

    @OneToOne(mappedBy = "a", cascade={CascadeType.ALL}) 
    public B getB() { 
     return b; 
    } 
} 

@Entity 
@Table (name= "b") 
class B{ 
    private A a; 

    @OneToOne 
    @JoinColumn(name = "id_a") 
    public A getA() { 
     return a; 
    } 

} 

と表のようになっています。

A)| id_A | ....他のフィールド... |

B)| id_B | fk_id_A | ..その他のフィールド.. |

しかし、私はAのインスタンスを削除しようとすると、私は、

org.hibernate.ObjectDeletedException取得: 削除されたオブジェクトは カスケードによって再保存されます: (削除されたオブジェクトを削除

b.setA(null) 
a.setB(null) 
:[B番号130])の関連から

Iは、相互参照にヌルに設定しようとしました

例外はまだスローされます。

私が達成したのは、Aの行を削除してBの外部キーをnullのままにすることですが、Bを削除しようとすると同じエラーが発生します。

public static void delete(Object object) throws Exception { 
     Transaction tx = getSession().beginTransaction();  
     try { 
      getSession().delete(object); 
      tx.commit(); 
     } catch (Exception ex) { 
      tx.rollback(); 
      getSession().close(); 
      throw ex; 
     } 
    } 

getSession常に有効なセッションを返します。

これは私の削除のコードがあります。

紛失しているものはありますか?

答えて

1

トップからスタートして作業を続けます。テーブルBのAへの参照を削除する必要があります。したがって、Aで削除しようとしているレコードのB内の参照を見つけて、そのレコードをBで削除します。次にAに戻り、Aでレコードを削除します。

SQL Serverを使用している場合は、テーブルAにカスケード削除を設定できます。これは自動的に行われます。あなたはこれに注意する必要があります。複雑な構造の場合はこれをお勧めしません。

0

相互参照のナレーションを別のトランザクションで実行していますか?これらの変更は、削除が機能するためにコミットする必要があります。