0

我有:

class Candidate {

    private String name;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "candidate_vacancy", joinColumns = @JoinColumn(name = "candidate_id"), inverseJoinColumns = @JoinColumn(name = "vacancy_id"))
    List<Vacancy> list;
//get and set methods
}

我以 html 形式写:

<form action="saveCandidate">
  name: <input type="text" value="${candidate.name}" name="name" />
type="submit" value="save changes" />

在@Controller 我写了这段代码:

@RequestMapping("/saveCandidate")
    public String saveCandidate(Model model, @ModelAttribute Candidate candidate) {
        candidateService.update(candidate);
        return "candidateMenu";
    }

但是,如果当我更新候选对象时,适当的空缺在数据库中变为空。

我想我可以手动从数据库加载空缺,将其附加到候选人并更新,但我认为是更正确的方法!

4

3 回答 3

0

Candidate从我的角度来看,和之间不应该有任何直接关系Vacancy。据我了解,这种关系更多地基于查询,甚至更多地基于应用于查询的某些业务规则。

所以我会List<Vacancy> getVacancies(Candidate candidate)在我的服务/DAO 中有一个方法,而不是数据库关系。在实现该方法时,调用 Hibernate 来执行所需的查询,并在需要时应用任何业务规则。这样,您将始终获得指定用户的最新职位空缺列表。

否则,正如您已经看到的,无论何时添加新的Candidate,或者Vacancy您需要手动添加两者之间的关系。这与 Hibernate 无关,而与关系数据库的工作方式有关。

于 2013-08-13T15:17:31.897 回答
0

由于以下原因,您不能在这种情况下使用域对象作为绑定目标:

  1. 您需要获取现有对象的所有关系(或者它们将在您的情况下被删除)
  2. 这可能是一个安全问题。我可以在浏览器中更改您的表单,添加一些输入字段并更新您数据库中的其他一些字段。

您可以使用特殊的 DTO 对象(例如CandidateForm,这将对应于您的 html 表单字段):

<form action="saveCandidate">
  <input type="hidden" value="${candidate.id}" name="id" />
  name: <input type="text" value="${candidate.name}" name="name" />

@RequestMapping("/saveCandidate")
public String saveCandidate(Model model, @ModelAttribute CandidateForm candidateForm) {
    Candidate candidate = new Candidate();
    if(candidateForm.getId() != null) {
       candidate = candidateService.getById(candidateForm.getId());
       // load existed object with relations, so they will be not removed
    }
    copyFieldsFromDtoToDomainObject(candidateForm, candidate);
    candidateService.update(candidate); // I supose that this is actually saveOrUpdate
    return "candidateMenu";
}

id主键在哪里。

于 2013-08-13T15:53:08.900 回答
0

您可以借助位于 JavaBean 中的特殊方法来更新对象:

class Candidate {

    private String name;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "candidate_vacancy", joinColumns = @JoinColumn(name = "candidate_id"), inverseJoinColumns = @JoinColumn(name = "vacancy_id"))
    List<Vacancy> list;
    //get and set methods

    public Candidate updatePublicInfo(Candidate newCandidate) {
        this.name = newCandidate.getName();
        return this;
    }
}

比为您服务:

class CandidateServiceImpl implements CandidateService {

    // other methods

    public void update(Candidate candidate) {
        Candidate oldCandidate = candidateDao.findById(candidate.getId());
        oldCandidate.updatePublicInfo(candidate);
        candidateDao.save(oldCandidate);
    }
}
于 2013-08-13T15:58:22.207 回答