JPA更新多对多删除记录
我在两个实体之间有@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;
...
}
它出现在我的问题是我没有合并enti TY。
它可能与此相关question。您必须确保在映射对象中有适当定义的hashCode equals方法,以便Eclipselink可以确定相等性,从而确定现有对象映射到DB中的现有对象。否则,它不得不每次都重新创建子对象。
另外,我读过这种连接只能支持有效添加和删除列表项,如果您使用索引列,但这将是EclipseLink特定的,因为JPA注释似乎不支持这样的事情。我知道有一个等效的Hibernate注释,但我不知道Eclipselink会是什么样子,如果存在这样的事情。
感谢您的洞察力。我尝试覆盖我的User类中的equals和hashCode方法;但它仍然不会阻止JPA删除/重新创建我的连接表中的记录。也许我没有正确实施这个... – 2010-08-17 19:17:55
JPA不使用对象标识但是使用数据库标识。 – 2010-08-18 08:06:00
试试这个:
1)改变声明:
private List<UserType> types = new Vector<UserType>();
2)永远不会调用
user.setTypes(newTypesList)
3)只调用
user.getTypes().add(...);
user.getTypes().remove(...);
请你详细说明为什么我应该改变我的声明? – 2010-08-18 17:04:20
使用Set
而不是List
解决了这个问题。但我不知道它为什么起作用。
Hibernate提供的另一个解决方案是将@ManyToMany
关联分为两个双向关系。例如,请参阅Hibernate 5.2 documentation。
如果双向
@OneToMany
协会更好地执行删除或更改子元素的顺序时 的@ManyToMany
关系不能从这样的优化,因为 外键面是不是在控制中受益。为了克服这个限制,必须直接暴露链接表,并且将关联分成两个双向关系。
我正在使用集合,更改为设置,它工作正常。我渴望知道为什么.. – alextsil 2018-03-03 14:16:55
这是什么意思?我有同样的问题。你可以发布解决方案吗? – Sarah92 2014-11-21 15:03:36
同样的问题。你能详细分享你的解决方案吗? – 2017-10-22 08:29:08