У меня есть простой набор сетки данных, каждый тип данных является сущностью. Каждый корневой каталог имеет внутренний набор объектов (@OneToMany
). Когда я пытаюсь удалить корневую сущность, все идет хорошо. Но когда я пытаюсь удалить внутреннюю сущность, ничего не происходит. Обновление работает хорошо. Итак, мой корневой объект является Group
и внутренняя Task
Объект не удаляется
Группы объекта:
@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;
}
объект Задачи:
@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!!!<<<");
}
}
Руководитель группы:
@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);
}
}
Благодарим вас заблаговременно!
UPD:
Как сказал @ Крис, я решил проблему путем выдергивания Task
объекта из коллекции Group
«s. Сейчас это работает:
public void delete(Task task){
task = em.merge(task);
Group group = em.merge(task.getGroup());
group.getTasks().remove(task);
em.remove(task);
}
Спасибо всем!
Я сделал это уже в объекте Task от @PreRemove аннотации –
Это исключает ссылку задачи на группу. Проблема связана с любой ссылкой на задачу - вы оставили группу, ссылающуюся на эту задачу, которая, поскольку ссылка является каскадным слиянием, заставляет задачу быть воскрешенной. – Chris