簡體   English   中英

如何在冬眠和春季中刪除或保存多對多關系

[英]how to delete or save a many to many relationship in hibernate & spring

我在2張桌子之間有很多對很多的關系。 以下是帶有映射的兩個表。 StaffSearchCriteria用於搜索具有所選技能的人員。 此搜索條件將保留在數據庫中,以便我們以后可以再次查找它。

我面臨的問題是我無法正確保存此數據。 我不了解映射的“級聯”部分。 因此,如果我執行“ Cascade.ALL ”,則數據將正確保存,但是當我刪除搜索條件時,它也會刪除與之關聯的Skill條目,這是錯誤的。 我只希望如果我刪除Skill, StaffSearchCriteria條目就不會被刪除,並且對於該Skill類似; 僅應刪除所選數據並將其輸入到映射表中。 另一個表不應受到該操作的影響。

StaffSearchCriteria

    @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM