0

Movie と Director の 2 つのエンティティを指定します。

@実在物

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";
  }

ムービーが送信されたときに既存のディレクター エンティティを読み込む最適なパターンは何ですか? どうもありがとう

4

2 に答える 2

0

ムービーにDirectorが必須の場合は、FetchType=EAGERを使用してロードすることをお勧めします。また、一部のロジックで各ムービーエンティティにDirectorオブジェクトが必要な場合は、EAGERを使用することをお勧めします。

FetchType = LAZYを使用すると、movie.getDirector()メソッドを呼び出すときにDirectorエンティティがフェッチされます。

于 2012-06-19T10:55:28.497 に答える
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」が null かどうかを確認できます。ディレクター ID が null でない場合、saveMovie() が呼び出されたときに使用できるように、データベースからディレクターをロードできます。電話することを忘れないでください

movie.setDirector(director);

saveMovie() メソッドで。

于 2012-06-19T15:39:11.800 に答える