在保持单向@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中的集成测试有效。显然我错过了什么,但无法发现问题...
答案 0 :(得分:0)
save()有什么作用?
问题很可能是你的对象被分开了,所以永远不要分配他们的id,所以没有任何东西与托管对象相关。
您需要持久化而不是合并它们(并确保使用未分离的托管对象)。或者返回id,或者在保存后执行查找,以确保使用有效对象。