Java JPA更新多对多删除记录
我在两个实体之间有着@manytomy关系。当我在拥有方执行更新时,JPA似乎会从我的数据库中删除所有链接记录并重新插入它们。对我来说,这是一个问题,因为我有一个MySQL触发器,它在删除记录之前触发。有没有办法解决这个问题Java JPA更新多对多删除记录,java,mysql,jpa,eclipselink,jpa-2.0,Java,Mysql,Jpa,Eclipselink,Jpa 2.0,我在两个实体之间有着@manytomy关系。当我在拥有方执行更新时,JPA似乎会从我的数据库中删除所有链接记录并重新插入它们。对我来说,这是一个问题,因为我有一个MySQL触发器,它在删除记录之前触发。有没有办法解决这个问题 @Entity public class User { @Id @Column(name="username") private String username; ... @ManyToMany @JoinTable(n
@Entity
public class User {
@Id
@Column(name="username")
private String username;
...
@ManyToMany
@JoinTable(name="groups", joinColumns=
@JoinColumn(name="username", referencedColumnName="username"),
inverseJoinColumns=@JoinColumn(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;
...
}
@实体
公共类用户{
@身份证
@列(name=“username”)
私有字符串用户名;
...
@许多
@JoinTable(name=“groups”,JointColumns=
@JoinColumn(name=“username”,referencedColumnName=“username”),
inverseJoinColumns=@JoinColumn(name=“groupname”,
referencedColumnName=“type\u id”))
私有列表类型;
...
}
@实体
公共类用户类型{
@身份证
@列(name=“type\u id”)
私有字符串id;
@许多(mappedBy=“类型”)
私人名单用户;
...
}
这可能与此有关。您必须确保在映射的对象中有一个适当定义的hashCode和equals方法,以便Eclipselink可以确定相等性,从而确定现有对象映射到数据库中的现有对象。否则,它别无选择,只能每次重新创建子对象
或者,我已经读到,如果使用索引列,这种连接只能支持有效地添加和删除列表项,但这将是特定于EclipseLink的,因为JPA注释似乎不支持这样的事情。我知道有一个等价的Hibernate注释,但我不知道它在Eclipselink中会是什么,如果这样的东西存在的话 试试这个:
1) 将声明更改为:
private List<UserType> types = new Vector<UserType>();
3) 唯一的电话
user.getTypes().add(...);
user.getTypes().remove(...);
看来我的问题是我没有合并实体。使用
Set
而不是List
解决了问题。但我不知道为什么它会起作用
Hibernate提供的另一个解决方案是将@manytomy
关联拆分为两个双向@OneTo@Many
关系。例如,见
如果双向@OneToMany
关联在
删除或更改子元素的顺序时,@manytomy
关系不能从这种优化中受益,因为
外键侧不受控制。为了克服这一局限性
链接表必须直接公开,@manytomy
关联
分为两个双向@OneToMany
关系
谢谢你的洞察力。我尝试在我的用户类中重写equals和hashCode方法;但是,它仍然不能阻止JPA删除/重新创建我的联接表中的记录。也许我没有正确地实现这一点…JPA使用的不是对象标识而是数据库标识。请您详细说明我为什么要更改声明?这意味着什么?我也有同样的问题。你能发布解决方案吗?同样的问题。你能详细分享你的解决方案吗?请分享你的解决方案我使用了Collection,改为Set,效果很好。我很想知道为什么。。
user.getTypes().add(...);
user.getTypes().remove(...);