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

hibernate, hibernate-mapping, java, jpa, orm

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;
}

Problem

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: - Delete all children automatically when parent delete (one to many) - Delete child automatically from children list when it is deleted (many to one) - Delete toy automatically when child remove (one to one) I'm using Hibernate 4.3.5 and mysql 5.1.30. Thanks

Original source

Related problems