2013-08-14 6 views
0

У меня есть эта модель и спящий режим отображения:спящего режима объекта обновление частично

@Entity 
@Table(name = "candidate") 
public class Candidate extends Person { 

    private Set<Vacancy> vacancies= new HashSet<Vacancy>(); 

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "candidate_vacancy", joinColumns = @JoinColumn(name = "candidate_id"), inverseJoinColumns = @JoinColumn(name = "vacancy_id")) 
     public Set<Vacancy> getVacancies() { 
     return vacancies; 
    } 

    public void setVacancies(Set<Vacancy> vacancies) { 
     this.vacancies = vacancies; 
    } 
} 

Person класс:

  @MappedSuperclass 
      public abstract class Person { 
      private Integer id; 
      private String name; 
      @Id 
       @GeneratedValue(strategy = GenerationType.IDENTITY) 
       @Column (name = "id") 
       public Integer getId() { 
        return id; 
       } 

       public void setId(Integer id) { 
        this.id = id; 
       } 
      @Column(name = "name") 
      @NotEmpty 
      public String getName() { 
       return name; 
      } 

      public void setName(String name) { 
       this.name = name; 
      } 


} 

отображение вакансий

@Entity 
@Table(name = "vacancy") 
@XmlRootElement(name="vacancy") 

    public class Vacancy { 
    ... 
    @ManyToMany(mappedBy = "vacancies", fetch = FetchType.EAGER) 
    public Set<Candidate> getCandidates() { 
      return candidates; 
    ... 
     } 
} 

И я так HTML форму:

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

Я обрабатывать свою форму в моем методе @controller:

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

Используя этот способ, у меня есть проблема. вакансии, связанные с candodate удалить из моей базы данных. Я исправляю это так:

public String saveCandidate(Model model, @ModelAttribute Candidate candidate) { 
      Candidate candidate2 = candidateService.findById(candidate.getId()); 
     candidate.setName(candidate2.getName()); 
     candidate.setSurname(candidate2.getSurname()); 
     candidate.setPhone(candidate2.getPhone()); 
     candidate.setResumeUrl(candidate2.getResumeUrl()); 
     candidateService.update(candidate2); 
     return "candidateMenu"; 
    } 

Но я думаю, что это очень плохо для решения моей проблемы.

P.S. Я знаю, что fetchType.lazy плох, но я не хочу его заменять.

+0

«Я знаю, что fetchType.lazy является ошибкой» <- Откуда вы знаете это? вы понимаете разницу между типами EAGE и LAZY? –

+0

не ошибка, плохой стиль я думаю – gstackoverflow

+0

Я понимаю различия – gstackoverflow

ответ

1

Вам необходимо сначала загрузить свою сущность из базы данных, а затем передать параметры запроса привязки пружины к вашим свойствам объекта.

Так что-то вроде ниже может работать

@ModelAttribute 
    public Candidate loadCandidate(@RequestParam(value="id",required=false) Long id) { 
     Candidate candidate=null; 
     if(id!=null){ 
     candidate=candidateService.findById(id); 
     } 
     else{ 
     candidate=new Candidate(); 
     } 

     return candidate; 
    } 

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

Как loadCandidate() метод с аннотацией @ModelAttribute аннотацию, так loadCandidate() будет вызываться до любого из requestmapping обработчиков в контроллере. , поэтому в вашем случае loadCandidate() будет использоваться до saveCandidate()

+0

Где мне нужно вызвать метод loadCandidate()? – gstackoverflow

+0

Вам не нужно вызывать метод loadCandidate() ..spring автоматически вызовет этот метод, поскольку он был анотирован с помощью @ModelAttribute – harrybvp

+0

момент, я попробую его – gstackoverflow