web-dev-qa-db-fra.com

Supprimer l'enfant d'un parent et le parent d'un enfant automatiquement avec les annotations JPA

Supposons que nous ayons la classe d'objet 3 Entities:

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

class Child {
    String name;
    Parent parent;
}

class Toy {
    String name;
    Child child;
}

Comment utiliser les annotations JPA2.x (ou hibernation) pour:

  1. Supprimer tous les enfants automatiquement lorsque le parent supprime (un à plusieurs)
  2. Supprimer l'enfant automatiquement de la liste des enfants quand il est supprimé (plusieurs à un)
  3. Supprimer le jouet automatiquement lorsque l'enfant enlève (un à un)

J'utilise Hibernate 4.3.5 et MySQL 5.1.30.

Merci

11
user1079877

Comme expliqué dans cet article , la removetransition d'état de l'entité devrait passer en cascade du parent aux enfants, et non l'inverse.

Vous avez besoin de quelque chose comme ça:

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;
}
18
Vlad Mihalcea

Vous devriez utiliser CascadeType.REMOVE. C'est une annotation courante pour Hibernate et JPA. Hibernate a un autre type similaire CacadeType comme CascadeType.DELETE.

  1. Supprimer tous les enfants automatiquement lorsque le parent supprime (un à plusieurs)

    class Parent {
      String name;
    
      @OneToMany(cascade = CascadeType.REMOVE)
      List<Child> children;
    }
    
  2. Supprimer l'enfant automatiquement de la liste des enfants quand il est supprimé (plusieurs à un)

    class Child {
     String name;
     @ManyToOne(cascade = CascadeType.REMOVE)
     Parent parent;
    }
    
  3. Supprimer le jouet automatiquement lorsque l'enfant enlève (un à un)

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

orphanRemoval is delete all tout exemple d'entité orpheline: magasin (s) a des livres (b1, b2, b3) et b1 a titre (t) dans ce cas si supprimé magasin (s) des livres (b2, b3) seront supprimés. B2 et t existent toujours. si vous utilisez "cascade= CascadeType.Remove", stockez juste un ou plusieurs livres et tous les livres seront supprimés (seul le "t" existe).

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

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

Si orphanRemoval = true est spécifié, l'instance d'entité déconnectée est automatiquement supprimée. Ceci est utile pour nettoyer des objets dépendants qui ne devraient pas exister sans une référence provenant d'un objet propriétaire.

Si seul cascade=CascadeType.REMOVE est spécifié, aucune action automatique n'est entreprise car la déconnexion d'une relation n'est pas une opération de suppression.

1