Neo
Neo

Reputation: 3705

JPA: Cascade remove does not delete child

Edit: Modifying the question to better reflect the problem. Originally posted question here

I have a parent (Context) and a child (User) entity (ManyToOne relationship). Cascade 'REMOVE' on the parent is not deleting the child. Code as below:

//Owning side - child
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = DBColumns.USER_NAME)
    private String name;
    @ManyToOne
    @JoinColumn(name = DBColumns.CONTEXT_ID)
    private Context context;
}

//parent
@Entity
public class Context {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = DBColumns.CONTEXT_NAME)
    private String name;
    @OneToMany(mappedBy = "context", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, orphanRemoval = true)
    private Set<User> users = new HashSet<User>();
}

//usage
Context sampleContext = new Context("sampleContext");
em.persist(sampleContext);
User sampleUser = new User(sampleContext, "sampleUser");
em.persist(sampleUser);
em.remove(sampleContext); //should remove user as well but throws foreign key dependency error

Upvotes: 4

Views: 6760

Answers (3)

Neo
Neo

Reputation: 3705

I needed to refresh the entity before removing it:

em.refresh(sampleContext);
em.remove(sampleContext);

Earlier, the entity being deleted (sampleContext) did not know that sampleUser is associated with it (probably because sampleContext was being fetched from cache). Doing a refresh before delete ensures that the entity is updated from the database.

Upvotes: 3

James
James

Reputation: 18379

You are calling remove() on sampleUser not sampleContext, and User does not cascade remove to Context, so you should only see the User being deleted.

If you call remove() on sampleContext, you must also ensure that when you created the User you added the User to the Context's users. You are most likely only setting the User's conext.

Upvotes: 1

Gab
Gab

Reputation: 8323

Don't map your relation table as en entity. Use @ManyToMany Instead and make your user entity owner of the relationship.

Edit :

So your association table primary key must be composed of both foreign key.

See this http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa/

Upvotes: 0

Related Questions