0

给出两个实体,电影和导演。

@实体

public class Movie extends BaseEntity {

  private static final long serialVersionUID = -1545404740388837658L;

  @Column(name="movieName", nullable=false, length=200)
  private String movieName;

  @Column(name="year", nullable=false)
  private Integer year; 

  @ManyToOne(fetch=FetchType.EAGER)
  @JoinColumn(name="director_id")
  private Director director;

  //setter, getter
}

@Entity
public class Director extends BaseEntity {

  @NotEmpty
  @Column(nullable = false, length=50)
  private String name;

  //setter, getter 
}

JSP中有一个表格

<form:form action="saveMovie" commandName="movie" >
    <p><label>Movie Name</label><form:input path="movieName" /></p> 
    <p><label>Year</label><form:input path="year" /></p>
    <p><label>Director</label><form:input id="txtDirector" path="director.id" /></p> 


    <p>
      <input type="submit" name="Save" />
    </p>
  </form:form>

这是没有 Director 处理的原始控制器

@RequestMapping(value="/saveMovie", method = RequestMethod.POST)
public String saveMovie(@ModelAttribute Movie movie, BindingResult result, SessionStatus status, ModelMap model) {


    getMovieModel().saveMovie(movie); //get a DAO to persist a Movie

    List<Movie> movies = getMovieModel().getAllMovies(); //reload all Movies
    model.put("allMovies", movies);
    return "test/allMovies";
  }

提交电影时加载现有 Director 实体的最佳模式是什么?非常感谢

4

2 回答 2

0

我制定了一个解决方案,但不确定这是在 Spring MVC 模型中“将现有实体关联到将被持久化到数据库中的新实体”的最佳模式。

这是我的代码修订:

@RequestMapping(value="/saveMovie", method = RequestMethod.POST)
  public String saveMovie(@ModelAttribute("movie") Movie movie, @ModelAttribute("director") Director director, BindingResult result, SessionStatus status, ModelMap model) { 
    /*please note that parameter "director" is newly added */
    logger.trace(movie.getMovieName() + "," + movie.getYear());
    movie.setDirector(director); // <-- newly added
    getMovieModel().saveMovie(movie);

    List<Movie> movies = getMovieModel().getAllMovies();
    model.put("allMovies", movies);
    return "test/allMovies";
  }

  @ModelAttribute("director") 
  public Director loadDirector(@RequestParam(value="director.id", required=false) Long id) {

    Director director = null;
    if (id != null) 
      director = getDirectorModel().loadDirector(id);
    return director;
  }

请看方法“loadDirector”被注解为@ModelAttribute,所以在每次调用控制器之前,首先调用loadDirector()。我可以检查请求参数“director.id”是否为空。如果 director id 不为 null,我可以从数据库中加载一个 Director,以便在调用 saveMovie() 时使用它。别忘了打电话

movie.setDirector(director);

在 saveMovie() 方法中。

于 2012-06-19T15:39:11.800 回答
0

如果 Director 对 Movie 是必需的,那么最好使用 FetchType = EAGER 加载。此外,如果某些逻辑需要每个电影实体的 Director 对象,那么最好使用 EAGER。

如果你使用 FetchType = LAZY ,当你调用 movie.getDirector() 方法时,它将获取 Director 实体。

于 2012-06-19T10:55:28.497 回答