質問

次の JPA アノテーションを持つ 2 つのエンティティがあります。

@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」テーブルの Data_id は null になります。これは正しいことです。

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

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

役に立ちましたか?

解決

休止状態のバージョンに応じて、次を使用します。

cascadeType を使用します。@OneToOne アノテーションの 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投稿を見つけました: Hibernate に 1 対 1 および多対 1 の関係に対する孤立削除のサポートがないことに対する回避策はありますか?

だからおそらく機能していないのでしょう。ただし、2 つの回答では 2 つの異なる回避策が説明されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top