2

JPA/HibernateでOneToOneアイテムを自動的に削除するにはどうすればよいですか? 含まれるクラスで OneToOne アイテムを null に設定するだけで、Hibernate がそれを削除できるほどスマートになると思います。

単純なオブジェクトが与えられた場合、単純化されます。

@Entity
public class Container {
    private Item item;

    @OneToOne(cascade=CascadeType.ALL)
    public Item getItem() { return item; }

    public void setItem(Item newItem) { item = newItem; }
}

Item が Container に設定されると、Container はマージされて永続化され、行が挿入されます。

Container container = new Container();
container.setItem(new Item());
container = entityManager.merge(container);
// Row count is 1

ただし、アイテムが null に設定されているか、別のアイテムに設定されている場合、古いオブジェクトはテーブルにまだ存在します。

container.setItem(null);
container = entityManager.merge(container);
// Row count is STILL 1, leaving orphaned rows.

では、これらの OneToOne オーファンを削除するにはどうすればよいでしょうか?

4

4 に答える 4

1

関係を許可しない休止状態の背後にある理由は、この問題に関連していると推測しています。DELETE_ORPHANOneToOne

本当にこれが悪い場合は、次の手順でハッキングできます。

  • OneToOne関係をOneToManyに変換します。
  • 子のコレクションの最初の要素を取得するためだけのメソッドを追加します (これはオプションですが便利です)
  • DELETE_ORPHANアノテーションを使用する

もちろん、これは大きなハックです。

于 2009-12-17T17:44:43.557 に答える
0

に変更してみてください

@OneToOne
@Cascade(cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN})

こちらの同様の投稿に関する私の回答も参照してください。

于 2009-04-02T10:55:31.373 に答える
0

残念ながら、Hibernate の実装に縛られずに JPA でこれを行う方法はありません。

そうです、Foxy が言うようorg.hibernate.annotations.CascadeTypeに、標準の JPA アノテーションの代わりに使用できます。これにより、 DELETE_ORPHAN. JPA の抽象化を使用する場合は、現時点では自分でオーファンを削除する必要があります。

于 2009-04-02T11:06:10.583 に答える