【发布时间】:2017-11-06 15:05:47
【问题描述】:
我有两个具有@ManyToMany 关系的实体,让我们举一个常见的例子 Student 和 Course,我正在保存一个包含学生列表的新课程,如果列表中有新学生,它应该级联新的,如果它存在,它应该更新它。
对于新学生和新课程,它可以正常工作,但对于新课程和现有学生,我会从数据库中抛出一个独特的约束违规。关系类似于下面。
@Entity
@Table
public class Course implements Serializable {
@Id
@Column(name = "CRS_ID")
@SequenceGenerator(name = "rcrsSeq", sequenceName = "CRS_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "rcrsSeq")
private Long id;
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE,
CascadeType.REFRESH,
CascadeType.DETACH
})
@JoinTable(name = "student_courses",
uniqueConstraints = @UniqueConstraint(columnNames = {"STU_ID", "CRS_ID"}),
joinColumns = {@JoinColumn(name = "CRS_ID")},
inverseJoinColumns = {@JoinColumn(name = "STU_ID")}
)
private List<Student> students;
//getters and setters
}
@Entity
@Table(uniqueConstaints = @UniqueConstraint(columnNames = {"username"}))
public class Student implements Serializable {
@Id
@Column(name = "STU_ID")
@SequenceGenerator(name = "rstuSeq", sequenceName = "STU_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "rstuSeq")
private Long id;
@ManyToMany(mappedBy = "students")
private List<Course> courses;
private String userName;
//getters and setters
// equals + hashcode based on userName
}
在坚持之前,我尝试使用 entitymanager 查找学生,如果该学生存在,则使用该实例而不是新的学生实例。这也不起作用,它仍然尝试插入而不是更新
【问题讨论】:
-
也许你需要添加确切的代码来重现这个。还有唯一的约束违反异常详细信息。最后但并非最不重要的一点是,如果碰巧有唯一字段提及这些字段,例如,许多学生可以有相同的用户名吗?
标签: java jpa eclipselink