web-dev-qa-db-ja.com

JPAアノテーションを使用して、子を親から、親を子から自動的に削除する

3つのEntitiesオブジェクトクラスがあるとします。

class Parent {
    String name;
    List<Child> children;
}

class Child {
    String name;
    Parent parent;
}

class Toy {
    String name;
    Child child;
}

JPA2.x(またはhibernate)アノテーションを使用して、次のことを行うにはどうすればよいですか。

  1. 親が削除するときにすべての子を自動的に削除する(1対多)
  2. 削除時に子リストから子を自動的に削除します(1対多)
  3. 子供が削除するとおもちゃを自動的に削除する(1対1)

Hibernate 4.3.5とmysql 5.1.30を使用しています。

ありがとう

15
user1079877

この記事 で説明されているように、removeエンティティの状態遷移 は、親から子にカスケードする必要があり、その逆ではありません。

あなたはこのようなものが必要です:

class Parent {
    String name;
    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    List<Child> children;

    public void addChild(Child child) {
        child.setParent(this);
        children.add(child);
    }

    public void removeChild(Child child) {
        children.remove(child);
        if (child != null) {
            child.setParent(null);
        }
    }
}

class Child {
    String name;
    @ManyToOne
    Parent parent;

    @OneToOne(mappedBy = "child", cascade = CascadeType.ALL, orphanRemoval = true)
    Toy toy;
}

class Toy {
    String name;

    @OneToOne
    Child child;
}
23
Vlad Mihalcea

CascadeType.REMOVEを使用してください。これは、HibernateとJPAの両方に共通のアノテーションです。 Hibernateには、CascadeType.DELETEのような別の類似のタイプCacadeTypeがあります。

  1. 親が削除するときにすべての子を自動的に削除する(1対多)

    class Parent {
      String name;
    
      @OneToMany(cascade = CascadeType.REMOVE)
      List<Child> children;
    }
    
  2. 削除時に子リストから子を自動的に削除します(1対多)

    class Child {
     String name;
     @ManyToOne(cascade = CascadeType.REMOVE)
     Parent parent;
    }
    
  3. 子供が削除するとおもちゃを自動的に削除する(1対1)

    class Toy {
      String name;
      @OneToOne(cascade = CascadeType.REMOVE)
      Child child;
    }
    
7
Masudul

orphanRemoval is all delete Orphan entity example:store(s)has books(b1、b2、b3)and b1 has this title(t)この場合、ストアを削除すると、books(b2、b3)がいくつか削除されます。 B2とtはまだ存在しています。 「cascade= CascadeType.Remove "ストアのみで、すべての書籍が削除されます(" t "のみが存在します)。

s->b1,b2,b3 b2->t ------after(orphanRemoval = true)--------- b2->t

s->b1,b2,b3 b2->t ------ after(cascade=CascadeType.REMOVE)--------- t

OrphanRemoval = trueが指定されている場合、切断されたエンティティインスタンスは自動的に削除されます。これは、所有者オブジェクトからの参照なしでは存在してはならない依存オブジェクトをクリーンアップするのに役立ちます。

cascade=CascadeType.REMOVEが指定されている場合、関係の切断は削除操作ではないため、自動アクションは実行されません。

1