Search code examples
javahibernatejpaormhibernate-mapping

Delete child from parent and parent from child automatically with JPA annotations


Suppose that we have 3 Entities object class:

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

class Child {
    String name;
    Parent parent;
}

class Toy {
    String name;
    Child child;
}

How can I use JPA2.x (or hibernate) annotations to:

  1. Delete all children automatically when parent delete (one to many)
  2. Delete child automatically from children list when it is deleted (many to one)
  3. Delete toy automatically when child remove (one to one)

I'm using Hibernate 4.3.5 and mysql 5.1.30.

Thanks


Solution

  • The remove entity state transition should cascade from parent to children, not the other way around.

    You need something like this:

    class Parent {
    
        String name;
    
        @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
        List<Child> children = new ArrayList<>();
    
        public void addChild(Child child) {
            child.setParent(this);
            children.add(child);
        }
    
        public void removeChild(Child child) {
            children.remove(child);
            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;
    }