代码之家  ›  专栏  ›  技术社区  ›  Jordan Allan

JPA更新多对多删除记录

  •  2
  • Jordan Allan  · 技术社区  · 15 年前

    我在两个实体之间有很多关系。当我在拥有端执行更新时,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;
    
        ...
    } 
    
    4 回复  |  直到 11 年前
        1
  •  3
  •   Bian Jiaping    7 年前

    使用 Set 而不是 List

    Hibernate提供的另一个解决方案是分割 @ManyToMany 联想成两个双向的 @OneTo@Many Hibernate 5.2 documentation 例如。

    @OneToMany 移除或更改子元素的顺序时 @许多 链接表必须直接公开,并且 一分为二 @单亲 关系。

        2
  •  2
  •   Igor Mukhin    15 年前

    试试这个:

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

    user.setTypes(newTypesList)
    

    3) 只打电话

    user.getTypes().add(...);
    user.getTypes().remove(...);
    
        3
  •  2
  •   Jordan Allan    15 年前

    看来我的问题是我没有合并实体。

        4
  •  1
  •   Community CDub    8 年前

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