12

2つのエンティティがあり、次のJPAアノテーションが付いています。

@Entity
@Table(name = "Owner")
public class Owner implements Serializable
{
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private long id;

  @OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL)
  @JoinColumn(name="Data_id")
  private Data Data;  
}

@Entity
@Table(name = "Data")
public class Data implements Serializable
{
  @Id
  private long id;
}

所有者とデータには1対1のマッピングがあり、所有側は所有者です。実行すると問題が発生します:owner.setData(null); ownerDao.update(owner) ; 「Owner」テーブルのData_idがnullになります。これは正しいです。

ただし、「データ」行は自動的に削除されません。別のDataDaoと、2つのアクションをラップする別のサービスレイヤーを作成する必要があります(ownerDao.update(owner); dataDao.delete(data);)

所有する所有者がデータ行をnullに設定したときに、データ行を自動的に削除することはできますか?

4

1 に答える 1

19

Hibernateのバージョンに応じて、次を使用します。

@OneToOneアノテーションでcascadeType:DELETE_ORPHANまたはorphanRemoval=trueを使用します

ドキュメント:http ://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-transitive

OneToOneで試したことはありませんが、ドキュメントからは機能するはずです。

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL)
@JoinColumn(name="Data_id")
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Data Data;

また

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="Data_id")
private Data Data;

編集:私はこのSO投稿を見つけました:1対1および多対1の関係に対するHibernateの削除孤立サポートの欠如の回避策?

おそらくそれは機能していません。ただし、2つの回答は、2つの異なる回避策を説明しています。

于 2010-06-14T09:38:40.267 に答える