2012-06-19 45 views
0

給出兩個實體Movie和Director。使用Spring MVC提交數據時加載Hibernate實體的最佳實踐

@Entity

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> 

這是一個沒有董事原始控制器處理

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

什麼是加載一個最好的模式現有的導演實體何時提交電影? 非常感謝

+0

請更具體一些。你到底想要什麼? –

+0

Hi Japs,如果Moive是一個新插入的實體,但Director已經存在於數據庫中(Director在客戶端視圖頁面中選擇),我如何確保Director將被更新而不是插入新的實體? – Matt

回答

0

如果Director對於Movie是強制的,那麼最好使用FetchType = EAGER加載。 另外,如果您需要某個邏輯的每個Movie實體的Director對象,那麼最好使用EAGER。

如果您使用FetchType = LAZY,那麼當您調用movie.getDirector()方法時,它將獲取Director實體。

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不爲空,我可以從數據庫加載Director,以便在調用saveMovie()時使用它。 不要忘記調用

movie.setDirector(director); 

在saveMovie()方法。