2

我有这个模型:

@Entity
@Table(name = "candidate")
@XmlRootElement(name = "candidate")
public class Candidate{
@ManyToMany(mappedBy = "candidates", fetch = FetchType.EAGER)
    @XmlTransient
    public Set<Vacancy> getVacancies() {
        return vacancies;
    }
....
}

和回映射:

@Entity
@Table(name = "vacancy")
@XmlRootElement(name="vacancy")
public class Vacancy {@ManyToMany( fetch = FetchType.EAGER)
    @JoinTable(name = "vacancy_candidate", joinColumns = @JoinColumn(name = "vacancy_id"), inverseJoinColumns = @JoinColumn(name = "candidate_id"))
    public Set<Candidate> getCandidates() {
        return candidates;
    }
    ...
}

我有这样的Controller方法:

@RequestMapping("/saveCandidate")
public String saveCandidate(
        Model model,
        @ModelAttribute("candidateFromRequest") Candidate candidateFromRequest,

        @ModelAttribute("vacanciesForCandidate") Set<Vacancy> vacanciesForCandidate,

        RedirectAttributes redirectAttributes) {

    candidateService.updateCandidateAndLinkedEntities(candidateFromRequest,
            vacanciesForCandidate,...);
    ...
}

下一级:

    @Transactional
    @Service("candidateService")
    public class CandidateService {
    public void updateCandidateAndLinkedEntities(Candidate candidate,
                Set<Vacancy> vacancies, ...) {

            if (candidate == null)
                throw new NullPointerException("null candidate entity");


            if (vacancies != null) {

                candidate.setVacancies(vacancies);

                for (Vacancy vacancy : vacancies) {
                    vacancy.getCandidates().add(candidate);
                    vacancyDao.update(vacancy);
                }
            }
            candidateDao.update(candidate);//here all right, how I wish(I am about state of candidate entity)

        }
        ...
    }

更新方法实现:

空缺:

@Override
    public boolean update(Vacancy vacancy) throws HibernateException {
        Session session = sessionFactory.getCurrentSession();
        if (vacancy == null) {
            return false;
        }
        session.update(vacancy);
        return true;

    }

候选人:

@Override
    public boolean update(Candidate candidate) throws HibernateException{
        Session session = sessionFactory.getCurrentSession();
        if (candidate == null) {
            return false;
        }
        session.update(candidate);

        return true;

    }

我有奇怪的行为。如果我向候选人添加新的空缺 - 它效果很好。但如果我删除空缺 - 它不起作用。

这对我来说是不明白的。

4

1 回答 1

1

当您从候选人列表中删除空缺时,不要忘记从空缺列表中删除候选人,反之亦然。还要记住:如果系统中有某个地方稍后发送已删除的空缺(反之亦然),则该实体将再次被持久化。

于 2013-09-16T13:48:04.633 回答