1

一方向の @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 を使用した統合テストは機能します。明らかに何かが欠けていますが、問題を見つけることができません...

4

1 に答える 1

0

save()は何をしますか?

この問題は、オブジェクトがデッチされている可能性が高いため、IDが割り当てられていないため、管理対象オブジェクトに関連するものはありません。

それらをマージするのではなく永続化する必要があります(そして、デタッチされていない管理対象オブジェクトを使用していることを確認してください)。または、IDを返すか、保存後に検索を実行して、有効なオブジェクトを使用していることを確認します。

于 2012-11-07T14:39:46.303 に答える