【问题标题】:JPA update many-to-many deleting recordsJPA更新多对多删除记录
【发布时间】:2011-03-31 01:58:20
【问题描述】:

我在两个实体之间有一个@ManyToMany 关系。当我在拥有方执行更新时,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;

    ...
} 

【问题讨论】:

    标签: java mysql jpa eclipselink jpa-2.0


    【解决方案1】:

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

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

    如果双向@OneToMany 关联在以下情况下表现更好 删除或更改子元素的顺序,@ManyToMany 关系不能从这种优化中受益,因为 外键方不受控制。为了克服这个限制, 链接表必须直接暴露和@ManyToMany关联 分成两个双向@OneToMany 关系。

    【讨论】:

    • 我用的是 Collection,改成 Set 就可以了。我很想知道为什么..
    【解决方案2】:

    试试这个:

    1) 将声明更改为:

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

    2) 从不打电话

    user.setTypes(newTypesList)
    

    3) 只调用

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

    【讨论】:

    • 您能否详细说明我为什么要更改我的声明?
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的洞察力。我尝试在我的 User 类中覆盖 equals 和 hashCode 方法;但是它仍然不能阻止 JPA 删除/重新创建我的连接表中的记录。也许我没有正确实现这一点......
    • JPA 不使用对象身份,而是使用数据库身份。
    【解决方案4】:

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

    【讨论】:

    • 这是什么意思?我有同样的问题。你能发布一个解决方案吗?
    • 同样的问题。你能详细分享你的解决方案吗?
    • 请分享您的解决方案
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多