2012-06-19 79 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()方法。