JPA:持久重用收集项目@ManyToMany

时间:2012-11-07 09:19:26

标签: jpa eclipselink

在保持单向@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...
}

接下来在某些服务中我创建了新列表和两个订阅者......

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'

保存第一个订阅者后,列表成为管理实体,但是在保存第二个订阅者时,JPA再次尝试创建列表:

Call: INSERT INTO SUBSCRIBERSLIST (ID, DESCRIPTION, TITLE) VALUES (?, ?, ?)
bind => [2, null, DEFAULT]

有趣的是,我在内存hsqldb中的集成测试有效。显然我错过了什么,但无法发现问题...

1 个答案:

答案 0 :(得分:0)

save()有什么作用?

问题很可能是你的对象被分开了,所以永远不要分配他们的id,所以没有任何东西与托管对象相关。

您需要持久化而不是合并它们(并确保使用未分离的托管对象)。或者返回id,或者在保存后执行查找,以确保使用有效对象。