2014-02-27 131 views
0

有一种方法可以使用@jointable映射多对多关系,并避免可联接行的自动级联?JPA(with Hibernate)@ManyToMany @JoinTable关系级联

@ManyToMany注释的级联属性是创建/合并/删除相关的实体(不是jointable行)和@JoinTable插入/更新的joincolumns/inversejoincolumns属性被忽略,当我坚持/合并附属实体的关系。

例:User(所有者)×Role(的mappedBy)的关系,当我合并与角色的收集空的用户,表USER_ROLE的所有行被该用户删除。

韩国社交协会提前。


这是我的观点:

为了使问题的问题简单,让我们假设我有三个属性的用户实体:ID,电子邮件和一组角色(所有者,@ManyToMany的,@JoinTable )。 我会合并有至少一个或多个角色的用户实体,没有找到它通过的EntityManager:

User user = new User(); //detached 
user.setId(1L); // for merge 
user.setEmail("[email protected]"); 

entityManager.merge(user); 

在数据库中的结果是:

UPDATE user... /*ok!*/ 
delete from user_role where ... /* I'd like to avoid it! */ 
+0

你有什么问题? – Rembo

+0

非常感谢您的回复。我将编辑我的问题以发布问题 – Tiago

+0

@Tiago,因此您尝试将用户与数据库中的其他用户合并? – user3252538

回答

1

我认为,问题是你是试图合并一个detached entity。如果这样,独立实体不再在你坚持下去它相同会议。当你合并,你需要创建新实例,并尝试从以前的管理实例复制状态(它不再管理实体,因为它脱离实体),所以你得到一个空的状态,因为它是空的休眠删除此对象。您需要将您的托管实体从会话中取出,然后执行合并。这只是我的猜测。

编辑:

您的实体是级联的。这些实体的结果表示在您的user_role中。假设您将用户(ID = 30L)与某些角色集合保持在一起。现在,您在UI中处理了这个分离的对象,并且由于某些情况想要合并()。如果是这样,你只需使用SAME TYPE和THE SAME创建新的实例(在你的UI中为它设置一个新的状态(通常你不创建它,你只需通过id从会话范围中获取它)。执行它,休眠尝试找到对象具有相同的身份。

  1. 如果它发现它,它只是更新它在表格中。

  2. 如果没有,它会在你的表一个新的。

    所以我认为你的版本是第一个。

+0

非常感谢您的回复。我用一个例子更新了这个问题来解释我的观点。 – Tiago

+0

谢谢你的帮助。每当我需要合并这个实体时,我都必须从上下文中找到它(查找),更新我想合并和合并实体的字段。我不能简单地实例化它并设置PK。如果我需要更新关系,我简单地加载它,删除我想删除的条目并添加我想包含的实例。 – Tiago

+0

是的,这是一个正确的方法:) – user3252538

相关问题