【问题标题】:Hibernate is not giving me recently saved recordHibernate 没有给我最近保存的记录
【发布时间】:2016-02-26 03:40:11
【问题描述】:

我正在使用 Struts + 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,这一次我在列表中看到了新记录。谁能帮我看看这里发生了什么?

【问题讨论】:

    标签: hibernate


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多