![](/img/trans.png)
[英]How to save multiple entity in one action related in Many to Many Relationship [Spring Boot 2, JPA, Hibernate, PostgreSQL]
[英]how to delete or save a many to many relationship in hibernate & spring
我在2張桌子之間有很多對很多的關系。 以下是帶有映射的兩個表。 StaffSearchCriteria用於搜索具有所選技能的人員。 此搜索條件將保留在數據庫中,以便我們以后可以再次查找它。
我面臨的問題是我無法正確保存此數據。 我不了解映射的“級聯”部分。 因此,如果我執行“ Cascade.ALL
”,則數據將正確保存,但是當我刪除搜索條件時,它也會刪除與之關聯的Skill
條目,這是錯誤的。 我只希望如果我刪除Skill, StaffSearchCriteria
條目就不會被刪除,並且對於該Skill
類似; 僅應刪除所選數據並將其輸入到映射表中。 另一個表不應受到該操作的影響。
@Entity
@Table(name = "staff_search_criteria")
@NamedQueries({
@NamedQuery(name = "StaffSearchCriteria.findAll", query = "SELECT s FROM StaffSearchCriteria s")})
public class StaffSearchCriteria implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;
@Basic(optional = false)
@NotNull
@Column(name = "version")
private long version;
@Lob
@Size(max = 2147483647)
@Column(name = "description")
private String description;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 200)
@Column(name = "name")
private String name;
@ManyToMany(mappedBy = "staffSearchCriteriaCollection", cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
private Collection<Skill> skillCollection;
==================================================
@Entity
@Table(name = "skill")
@NamedQueries({
@NamedQuery(name = "Skill.findAll", query = "SELECT s FROM Skill s")})
public class Skill implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;
@Basic(optional = false)
@NotNull
@Column(name = "version")
private long version;
@Lob
@Size(max = 2147483647)
@Column(name = "description")
private String description;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = "name")
private String name;
@JoinTable(name = "mission_skill", joinColumns = {
@JoinColumn(name = "skill_id", referencedColumnName = "id")}, inverseJoinColumns = {
@JoinColumn(name = "mission_skills_id", referencedColumnName = "id")})
@ManyToMany(fetch = FetchType.LAZY)
private Collection<Mission> missionCollection;
@JoinTable(name = "staff_search_criteria_skill", joinColumns = {
@JoinColumn(name = "skill_id", referencedColumnName = "id")}, inverseJoinColumns = {
@JoinColumn(name = "staff_search_criteria_skills_id", referencedColumnName = "id")})
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
private Collection<StaffSearchCriteria> staffSearchCriteriaCollection;
public StaffSearchCriteria saveStaffSearchCriteria(StaffSearchCriteria staffSearchCriteria) {
logger.info(" [StaffSearchCriteriaDAOImpl] saveStaffSearchCriteria method called. - staffSearchCriteria = " + staffSearchCriteria);
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(staffSearchCriteria);
return staffSearchCriteria;
}
public void deleteStaffSearchCriteria(Long id) {
logger.info(" [StaffSearchCriteriaDAOImpl] deleteStaffSearchCriteria method called. - id = " + id);
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("FROM StaffSearchCriteria ssc where ssc.id = " + id);
if(null != query.uniqueResult()){
StaffSearchCriteria staffSearchCriteria = (StaffSearchCriteria)query.uniqueResult();
session.delete(staffSearchCriteria);
}
}
請在這里幫助我。我在做什么錯?
終於我解決了。 我所做的如下。
1.在控制器中,我發現從以前保存的數據中刪除了哪些技能。
2.將技能列表以及StaffSearchCriteria傳遞給服務保存方法。
3.在服務中,我遍歷要刪除的每個技能,並從中刪除了staffSearchCriteria對象並保存了它。
4.然后將人員搜索條件傳遞給dao,並使用saveOrUpdate方法。
以下是代碼片段。
1.Controller
List<Skill> skillList2 = new ArrayList<Skill>();
if(null != request.getParameterValues("skillCollection")){
for(String skillId : request.getParameterValues("skillCollection")){
if((!skillId.equals(null)) && skillId.length() > 0){
Skill skill = skillService.findSkillById(Long.parseLong(skillId));
// skill will be lazily initialized :(
// initialize it
skill.setStaffSearchCriteriaCollection(staffSearchCriteriaService.getAllStaffSearchCriteriaBySkillId(skill.getId()));
// set staff search criteria in each skill. because it is the owner
if(null != skill.getStaffSearchCriteriaCollection()){
skill.getStaffSearchCriteriaCollection().add(staffSearchCriteria);
}else{
List<StaffSearchCriteria> staffSearchCriteriaList = new ArrayList<StaffSearchCriteria>();
staffSearchCriteriaList.add(staffSearchCriteria);
skill.setStaffSearchCriteriaCollection(staffSearchCriteriaList);
}
skillList2.add(skill);
}
}
}
staffSearchCriteria.setSkillCollection(skillList2);
// Remove OLD skills also. plz. :)
List<Skill> skillList3 = null;
if(null != staffSearchCriteria && staffSearchCriteria.getId() != null && staffSearchCriteria.getId() > 0){
// this skillList3 will contain only those which are removed.
skillList3 = skillService.getAllSkillByStaffSearchCriteriaId(staffSearchCriteria.getId());
skillList3.removeAll(skillList2);
}
// now set staffSearchCriteriacollection and then pass it.
List<Skill> removedskillList = new ArrayList<Skill>();
if(null != skillList3){
for(Skill skill : skillList3){
skill.setStaffSearchCriteriaCollection(staffSearchCriteriaService.getAllStaffSearchCriteriaBySkillId(skill.getId()));
removedskillList.add(skill);
}
}
// now pass to service and save these skills after removing this staff search criteria from them.
staffSearchCriteria = staffSearchCriteriaService.saveStaffSearchCriteria(staffSearchCriteria, removedskillList);
2.Service
if(null != removedskillList && removedskillList.size() > 0){
for(Skill skill : removedskillList){
skill.getStaffSearchCriteriaCollection().remove(staffSearchCriteria);
skillDAO.saveSkill(skill);
}
}
return staffSearchCriteriaDAO.saveStaffSearchCriteria(staffSearchCriteria);
3.DAO
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(staffSearchCriteria);
4.實體課-技能
@JoinTable(name = "staff_search_criteria_skill", joinColumns = {
@JoinColumn(name = "skill_id", referencedColumnName = "id")}, inverseJoinColumns = {
@JoinColumn(name = "staff_search_criteria_skills_id", referencedColumnName = "id")})
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
private Collection<StaffSearchCriteria> staffSearchCriteriaCollection = new ArrayList<StaffSearchCriteria>();
5,實體類-StaffSearchCriteria
@ManyToMany(mappedBy = "staffSearchCriteriaCollection", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private Collection<Skill> skillCollection = new ArrayList<Skill>();
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.