2010-08-17 153 views
2

我在两个实体之间有@ManyToMany关系。当我在拥有方执行更新时,似乎JPA从我的数据库中删除所有链接的记录并重新插入它们。对我来说,这是一个问题,因为我有一个MySQL触发器在记录被删除之前触发。有关如何解决此问题的任何想法?JPA更新多对多删除记录

@Entity 
public class User { 

    @Id 
    @Column(name="username") 
    private String username; 

    ... 

    @ManyToMany 
    @JoinTable(name="groups", joinColumns= 
     @JoinColumn(name="username", referencedColumnName="username"), 
      [email protected](name="groupname", 
        referencedColumnName="type_id")) 
    private List<UserType> types; 

    ... 

} 

@Entity 
public class UserType { 

    @Id 
    @Column(name="type_id") 
    private String id; 

    @ManyToMany(mappedBy="types") 
    private List<User> users; 

    ... 
} 

回答

1

它出现在我的问题是我没有合并enti TY。

+1

这是什么意思?我有同样的问题。你可以发布解决方案吗? – Sarah92 2014-11-21 15:03:36

+1

同样的问题。你能详细分享你的解决方案吗? – 2017-10-22 08:29:08

1

它可能与此相关question。您必须确保在映射对象中有适当定义的hashCode equals方法,以便Eclipselink可以确定相等性,从而确定现有对象映射到DB中的现有对象。否则,它不得不每次都重新创建子对象。

另外,我读过这种连接只能支持有效添加和删除列表项,如果您使用索引列,但这将是EclipseLink特定的,因为JPA注释似乎不支持这样的事情。我知道有一个等效的Hibernate注释,但我不知道Eclipselink会是什么样子,如果存在这样的事情。

+0

感谢您的洞察力。我尝试覆盖我的User类中的equals和hashCode方法;但它仍然不会阻止JPA删除/重新创建我的连接表中的记录。也许我没有正确实施这个... – 2010-08-17 19:17:55

+0

JPA不使用对象标识但是使用数据库标识。 – 2010-08-18 08:06:00

1

试试这个:

1)改变声明:

private List<UserType> types = new Vector<UserType>(); 

2)永远不会调用

user.setTypes(newTypesList) 

3)只调用

user.getTypes().add(...); 
user.getTypes().remove(...); 
+1

请你详细说明为什么我应该改变我的声明? – 2010-08-18 17:04:20

2

使用Set而不是List解决了这个问题。但我不知道它为什么起作用。

Hibernate提供的另一个解决方案是将@ManyToMany关联分为两个双向关系。例如,请参阅Hibernate 5.2 documentation

如果双向@OneToMany协会更好地执行删除或更改子元素的顺序时 的@ManyToMany 关系不能从这样的优化,因为 外键面是不是在控制中受益。为了克服这个限制,必须直接暴露链接表,并且将关联分成两个双向关系。

+0

我正在使用集合,更改为设置,它工作正常。我渴望知道为什么.. – alextsil 2018-03-03 14:16:55