【问题标题】:Entity don't deleting [duplicate]实体不删除[重复]
【发布时间】:2016-03-10 13:20:52
【问题描述】:

我有一个简单的数据表网格表示,每个数据表都是一个实体。每个根数据表都有内部实体集合 (@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<<<");
    }


}

任务管理器:

@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:

正如@Chris 所说,我通过从Group 的集合中分离Task 实体来解决问题。现在可以了:

public void delete(Task task){
    task = em.merge(task);
    Group group = em.merge(task.getGroup());
    group.getTasks().remove(task);
    em.remove(task);
}

谢谢大家!

【问题讨论】:

    标签: jpa one-to-many sql-delete


    【解决方案1】:

    您需要先删除对该任务的所有引用,然后才能将其删除。任何使用级联合并或未清理的持久化的现有引用都可能导致实体被重新持久化,从而撤消您的删除。

    【讨论】:

    • 我已经在我的任务实体中通过@PreRemove 注释完成了
    • 这将取消任务对组的引用。问题在于对任务的任何引用 - 您离开了引用此任务的组,因为引用是级联​​合并,所以强制任务复活。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多