Reputation: 3705
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
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
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
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.
Upvotes: 0