本文介紹了JPA持久化與現(xiàn)有實(shí)體有關(guān)系的新實(shí)體的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我有兩個(gè)具有@ManyToMany
關(guān)系的實(shí)體,讓我們舉一個(gè)常見(jiàn)的示例學(xué)生和課程,我正在持久化一個(gè)新課程和一個(gè)學(xué)生列表,如果列表中有一個(gè)新學(xué)生,它應(yīng)該級(jí)聯(lián)新的學(xué)生,如果它已經(jīng)存在,它應(yīng)該更新它。
對(duì)于新學(xué)生和新課程的情況,它工作得很好,但是對(duì)于新課程和現(xiàn)有學(xué)生,我從數(shù)據(jù)庫(kù)中拋出了一個(gè)唯一的約束違反。關(guān)系如下。
@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查找一個(gè)學(xué)生,如果該學(xué)生存在,則使用該實(shí)例而不是新的學(xué)生實(shí)例。這也不起作用,它仍然嘗試執(zhí)行插入而不是更新
推薦答案
您寫的
但是,在新課程和現(xiàn)有學(xué)員的情況下,我會(huì)從數(shù)據(jù)庫(kù)中拋出唯一的約束沖突。
如果要持久化新的Course
對(duì)象和現(xiàn)有的Student
對(duì)象,應(yīng)執(zhí)行以下操作:
創(chuàng)建Course
的實(shí)例:
Course course = new Course(...);
獲取現(xiàn)有Student
:
Student student = entityManager.find(Student.class, id_of_student);
連接關(guān)系如下:
course.getStudents.add(student);
student.getCourse().add(course);
實(shí)際上您應(yīng)該調(diào)用entityManager.persist()
來(lái)保存新實(shí)體。但在這種情況下,這將不起作用,因?yàn)?code>student不是新的實(shí)體實(shí)例,并且persist()
不會(huì)保存現(xiàn)有的實(shí)體實(shí)例。因此,您可以使用entityManager.merge()
,即使它在語(yǔ)義上不正確(因?yàn)?code>merge應(yīng)該用于分離的實(shí)體):
entityManager.merge(course);
為了使其正常工作,您應(yīng)該調(diào)用事務(wù)中的所有實(shí)體管理器方法。
這篇關(guān)于JPA持久化與現(xiàn)有實(shí)體有關(guān)系的新實(shí)體的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,