I have a simple represent of datatables grid, every datatable is a entity. Every root datatable have inner collection of entities (@OneToMany
). When I'm trying to delete a root entity, everything goes well. But when I'm trying to delete inner Entity, nothing happenes. Updating works well. So, my root entity is Group
and inner Task
Group entity:
@Entity
@Table(name = "groups")
@NamedQueries({
@NamedQuery(name = Group.GET_ALL_GROUPS_BY_USER_ID,query = "SELECT g FROM Group g WHERE g.user.id = :user_id")
})
public class Group implements Serializable {
public static final String GET_ALL_GROUPS_BY_USER_ID = "GetAllGroupsByUserID";
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@OneToMany(fetch = FetchType.EAGER,mappedBy = "group",cascade = {CascadeType.PERSIST,CascadeType.REMOVE})
private List<Task> tasks;
}
Task entity:
@Entity
@Table(name = "tasks")
public class Task implements Serializable {
private static final long serialVersionUID = -5320541404604330486L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String text;
private boolean isComplete;
@ManyToOne
@JoinColumn(name = "group_id")
private Group group;
@PreRemove
public void remove(){
group = null;
System.out.println(">>>REMOVING<<<");
}
}
Task Manager:
@Stateless
public class TaskManager {
@PersistenceContext(unitName = "MySqlPU")
EntityManager em;
public Task update(Task task){
return em.merge(task);
}
public void delete(Task task){
task = em.merge(task);
em.remove(task);
System.out.println(">>>DELETED!!!<<<");
}
}
Group Manager:
@Stateless
public class GroupManager {
@PersistenceContext(unitName = "MySqlPU")
EntityManager em;
public List<Group> getAllGroupsByID(Long id){
return em.createNamedQuery(Group.GET_ALL_GROUPS_BY_USER_ID,Group.class)
.setParameter("user_id",id)
.getResultList();
}
public void delete(Group group){
group = em.merge(group);
em.remove(group);
}
}
Thank you in advance!
UPD:
As @Chris said, I solved problem by detaching Task
entity from Group
's collection. Now this works:
public void delete(Task task){
task = em.merge(task);
Group group = em.merge(task.getGroup());
group.getTasks().remove(task);
em.remove(task);
}
Thank you all!