2010-08-17 199 views
2

我在兩個實體之間有@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; 

    ... 
} 

回答

1

它出現在我的問題是我沒有合併enti TY。

+1

這是什麼意思?我有同樣的問題。你可以發佈解決方案嗎? – Sarah92 2014-11-21 15:03:36

+1

同樣的問題。你能詳細分享你的解決方案嗎? – 2017-10-22 08:29:08

1

它可能與此相關question。您必須確保在映射對象中有適當定義的hashCode equals方法,以便Eclipselink可以確定相等性,從而確定現有對象映射到DB中的現有對象。否則,它不得不每次都重新創建子對象。

另外,我讀過這種連接只能支持有效添加和刪除列表項,如果您使用索引列,但這將是EclipseLink特定的,因爲JPA註釋似乎不支持這樣的事情。我知道有一個等效的Hibernate註釋,但我不知道Eclipselink會是什麼樣子,如果存在這樣的事情。

+0

感謝您的洞察力。我嘗試覆蓋我的User類中的equals和hashCode方法;但它仍然不會阻止JPA刪除/重新創建我的連接表中的記錄。也許我沒有正確實施這個... – 2010-08-17 19:17:55

+0

JPA不使用對象標識但是使用數據庫標識。 – 2010-08-18 08:06:00

1

試試這個:

1)改變聲明:

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

2)永遠不會調用

user.setTypes(newTypesList) 

3)只調用

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

請你詳細說明爲什麼我應該改變我的聲明? – 2010-08-18 17:04:20

2

使用Set而不是List解決了這個問題。但我不知道它爲什麼起作用。

Hibernate提供的另一個解決方案是將@ManyToMany關聯分爲兩個雙向關係。例如,請參閱Hibernate 5.2 documentation

如果雙向@OneToMany協會更好地執行刪除或更改子元素的順序時 的@ManyToMany 關係不能從這樣的優化,因爲 外鍵面是不是在控制中受益。爲了克服這個限制,必須直接暴露鏈接表,並且將關聯分成兩個雙向關係。

+0

我正在使用集合,更改爲設置,它工作正常。我渴望知道爲什麼.. – alextsil 2018-03-03 14:16:55