2016-02-26 49 views
0

我使用的是Struts + Hibernate,我创建了一个应用程序,我可以保存电影记录并显示它们或搜索电影。但是我面临一个奇怪的问题。当我保存新的电影记录时,它会保存记录。之后,当我选择电影列表来显示电影表中的所有记录。它在第一次尝试时不显示新更新的记录。当我点击第二次显示电影列表时,它肯定会向我展示新的一行。为什么hibernate一次不给我最近插入的行。休眠是不是给我最近保存的记录

这是我的控制器添加电影。

public class AddMovieAction extends Action { 

    @Override 
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
     SessionFactory factory = (SessionFactory) getServlet().getServletContext().getAttribute("factory"); 
     AddMovieForm formFilled = (AddMovieForm) form; 
     MoviesDaoImpl moviesDaoImpl = new MoviesDaoImpl(factory); 

     ActionMessages actionMessages = new ActionMessages(); 
     if (moviesDaoImpl.addMovie(formFilled.getMovieName(), formFilled.getMovieReleaseYear(), 
       formFilled.getMovieLeadActor(), formFilled.getMovieHouseName())) { 
      actionMessages.add("success", new ActionMessage("message.success")); 
     } 
     saveMessages(request, actionMessages); 
     return mapping.findForward("samepage"); 
    } 
} 

这里是我的显示控制器

public class DisplayMoviesAction extends Action { 

    @Override 
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
     SessionFactory factory = (SessionFactory) getServlet().getServletContext().getAttribute("factory"); 
     MoviesDaoImpl moviesDaoImpl = new MoviesDaoImpl(factory); 
     List<Movie> movies = moviesDaoImpl.getAllMovies(); 
     request.setAttribute("movies", movies); 
     return mapping.findForward("list"); 
    } 
} 

这里是我的MoviesDaoImpl.java

public class MoviesDaoImpl implements MoviesDao { 

    private SessionFactory factory; 

    public MoviesDaoImpl(SessionFactory factory) { 
     this.factory = factory; 
    } 

    @Override 
    public List<Movie> getMovieByName(String name) { 
     Session session = factory.openSession(); 
     session.beginTransaction(); 
     try { 
      String hql = "FROM Movie M WHERE M.movieName like :movieName"; 
      org.hibernate.Query query = session.createQuery(hql); 
      query.setParameter("movieName", "%" + name + "%"); 
      @SuppressWarnings("unchecked") 
      List<Movie> movies = query.list(); 
      session.getTransaction().commit(); 
      return movies; 
     } catch (HibernateException e) { 
      e.printStackTrace(); 
      return null; 
     } finally { 
      session.close(); 
     } 
    } 

    @Override 
    public List<Movie> getAllMovies() { 
     Session session = factory.openSession(); 
     session.beginTransaction(); 
     @SuppressWarnings("unchecked") 
     List<Movie> movies = (List<Movie>) session.createQuery("From Movie").list(); 
     session.getTransaction().commit(); 
     session.close(); 
     return movies; 
    } 

    @Override 
    public boolean addMovie(String movieName, String movieReleaseYear, String movieLeadActor, String movieHouse) { 
     Session session = factory.openSession(); 
     try { 
      session.beginTransaction(); 
      // Check if movie is already exists or not. Why create duplicate rows of same movie 
      Movie movie = getExistingMovieByName(movieName); 
      if(movie==null){ 
       movie = new Movie(); 
      } 
      movie.setMovieName(movieName); 
      movie.setMovieReleaseYear(movieReleaseYear); 
      // Check if actor already exists or not. Why create duplicate rows of same actor 
      Actor actor = getExistingActor(movieLeadActor); 
      if(actor!=null){ 
       movie.setLeadActor(actor); 
      }else{ 
       actor = new Actor(); 
       actor.setActorName(movieLeadActor); 
       movie.setLeadActor(actor); 
      } 
      // Check if Movie House already exists or not. Why create duplicate rows of same Movie House 
      MoviesHouse moviesHouse = getMovieHouseId(movieHouse); 
      if (moviesHouse != null) { 
       System.out.println("MovieHouse Exists no need to create new record"); 
       movie.setMovieHouse(moviesHouse); 
      } else { 
       moviesHouse = new MoviesHouse(); 
       moviesHouse.setMovieHouseName(movieHouse); 
       movie.setMovieHouse(moviesHouse); 
       System.out.println("create movie house"); 
      } 
      session.saveOrUpdate(movie); 
      session.saveOrUpdate(actor); 
      session.saveOrUpdate(moviesHouse); 
      session.getTransaction().commit(); 

     } catch (HibernateException e) { 
      e.printStackTrace(); 
      return false; 
     } finally { 
      session.close(); 
     } 
     /*Session session1 = factory.openSession(); 
     session1.beginTransaction(); 
     @SuppressWarnings("unchecked") 
     List<Movie> movies = session1.createQuery("From Movie").list(); 
     for(Movie m:movies){ 
      System.out.println(m); 
     } 
     session1.getTransaction().commit(); 
     session1.close();*/ 
     return true; 
    } 

    public MoviesHouse getMovieHouseId(String movieHouseName) { 
     Session session = factory.openSession(); 
     session.beginTransaction(); 
     Criteria crit = session.createCriteria(MoviesHouse.class); 
     crit.add(Restrictions.eq("movieHouseName", movieHouseName)); 
     @SuppressWarnings("unchecked") 
     List<MoviesHouse> results = crit.list(); 
     MoviesHouse moviesHouse = null; 
     try { 
      moviesHouse = (MoviesHouse) results.get(0); 
      session.getTransaction().commit(); 
      return moviesHouse; 
     } catch (Exception e) { 
      return moviesHouse; 
     } finally { 
      session.close(); 
     } 
    } 
    public Actor getExistingActor(String actorName){ 
     Session session = factory.openSession(); 
     session.beginTransaction(); 
     Criteria crit = session.createCriteria(Actor.class); 
     crit.add(Restrictions.eq("actorName", actorName)); 
     @SuppressWarnings("unchecked") 
     List<Actor> results = crit.list(); 
     Actor actor = null; 
     try { 
      actor = (Actor) results.get(0); 
      session.getTransaction().commit(); 
      return actor; 
     } catch (Exception e) { 
      return actor; 
     } finally { 
      session.close(); 
     } 
    } 

    public Movie getExistingMovieByName(String movieName){ 
     Session session = factory.openSession(); 
     session.beginTransaction(); 
     Criteria crit = session.createCriteria(Movie.class); 
     crit.add(Restrictions.eq("movieName", movieName)); 
     @SuppressWarnings("unchecked") 
     List<Movie> results = crit.list(); 
     Movie movie = null; 
     try { 
      movie = (Movie) results.get(0); 
      session.getTransaction().commit(); 
      return movie; 
     } catch (Exception e) { 
      return movie; 
     } finally { 
      session.close(); 
     } 
    } 
} 

当我加入一个新的电影后打电话DisplayMoviesAction第一次。新创建的记录不会被抓取。但只要我再次点击列表电影,它会再次调用DisplayMovieAction,这次我看到列表中的新记录。任何人都可以帮助我在这里发生什么?

回答

-1

使用session.flush();session.getTransaction().commit();