@OneToOne と @JoinColumn、null エンティティを自動削除できますか?
-
27-09-2019 - |
質問
次の 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 つの異なる回避策が説明されています。