【发布时间】:2013-10-17 20:16:30
【问题描述】:
我有一个用户和标签表,还有一个包含多对多关系的 user_tag_xref 表。现在 netbeans 为我生成实体类(使用 eclipselink)下面是实体映射关系
关于用户类
@ManyToMany(mappedBy = "usersList")
private List<Tags> tagsList;
关于标签类
@JoinTable(name = "USERS_TAG_XREF", joinColumns = {
@JoinColumn(name = "TAG_ID", referencedColumnName = "TAG_ID")}, inverseJoinColumns = {
@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")})
@ManyToMany
private List<Users> usersList;
现在我的业务逻辑是 RESTfull 服务,一个 json 客户端使用这个方法
@POST
@Path("/registration2/tag")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response registration2_3(List<Tags>tagList,@Context HttpServletRequest req){
Profile p =(Profile) registerMap.get(req.getSession().getId());
Users u = em.find(Users.class,p.getUserId());
for(Tags t : tagList){
t.getUsersList().add(u);
u.getTagsList().add(t);
em.merge(t);
em.merge(u);
}
logger.log(Level.INFO, "the taglist created for user");
return Response.ok(u,MediaType.APPLICATION_JSON).build();
}
问题是每次我合并一个新用户以创建多对多关系时,如果现有 userid=6201 有一个带有 2,3,4 的标签,并且新用户尝试使用标签 id 2, 3,4, 现有用户被删除,新用户合并到标签。我已经阅读了几篇关于在我的实体类中覆盖哈希和等于方法的文章,这些方法在 eclipselink 中默认被覆盖,我也无法将我的集合类型更改为 Set 或 Collection,因为 List 类型非常适合 json 数组。我现在很难过,已经24小时了,会不会是默认映射策略错误?我需要级联吗?
【问题讨论】:
-
如果您正在查看,有人可以帮忙吗?请
-
当你对它调用合并时,t.getUserList() 中有什么? t 和 tagList 来自哪里?如前所述,当您调用merge 时,您必须小心标签实际上反映了您想要的数据库中的内容。如果它只是部分完成,您正在用部分数据覆盖完整数据。另外,什么被删除了,只是连接表中的引用吗?
-
克里斯的好问题。连接表中的引用被删除了吗?
-
t.getUserList() 包含(一个用户)一个 user_id 6201,他有 3 个 tags_id 1,2,3 在一对多关系中,t 和 tagList 来自一个 json 数组,我可以读取数组非常好,但是使用 shailendra 先生编写的代码,如果新的 user_id 6202 使用 post 方法发送 tagList 的 tag_id 为 1,2,3,则 user_id 6202 将有 1,2,3 从而从数据库中删除用户 6201
标签: rest jpa ejb many-to-many eclipselink