Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA更新多对多删除记录_Java_Mysql_Jpa_Eclipselink_Jpa 2.0 - Fatal编程技术网

Java JPA更新多对多删除记录

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

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

@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(...);