【发布时间】: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