一方向の @ManyToMany 関係の永続化に問題があります。SpringデータとMySQLでEclipseLink 2.3を使用しています。
エンティティの擬似コード:
@Entity
public class Subscriber {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
private List<SubscribersList> subscribersLists;
//...shortened...
}
@Entity
public class SubscribersList {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String title;
//...shortened...
}
次に、いくつかのサービスで、新しいリストと2人のサブスクライバーを作成します...
list = new SubscribersList("DEFAULT");
s1 = new Subscriber();
s1.getSubscribersList().add(list); //empty list is created in the constructor
repository.save(s1); //works ok
s2 = new Subscriber();
s2.getSubscribersList().add(list);
repository.save(s2); //fails with Duplicate entry '2' for key 'PRIMARY'
最初のサブスクライバーを保存した後、リストは管理対象エンティティになりますが、2 番目のサブスクライバーを保存すると、JPA はリストを再度作成しようとします。
Call: INSERT INTO SUBSCRIBERSLIST (ID, DESCRIPTION, TITLE) VALUES (?, ?, ?)
bind => [2, null, DEFAULT]
興味深いことに、メモリ内 hsqldb を使用した統合テストは機能します。明らかに何かが欠けていますが、問題を見つけることができません...