2016-03-10 2 views
0

У меня есть простой набор сетки данных, каждый тип данных является сущностью. Каждый корневой каталог имеет внутренний набор объектов (@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); 
} 

Спасибо всем!

ответ

0

Перед удалением необходимо удалить любые ссылки на задание. Любые существующие ссылки, которые используют cascade merge или persist, которые не очищены, могут привести к тому, что объект будет повторно сохранен, отменив удаление.

+0

Я сделал это уже в объекте Task от @PreRemove аннотации –

+0

Это исключает ссылку задачи на группу. Проблема связана с любой ссылкой на задачу - вы оставили группу, ссылающуюся на эту задачу, которая, поскольку ссылка является каскадным слиянием, заставляет задачу быть воскрешенной. – Chris

 Смежные вопросы

  • Нет связанных вопросов^_^