插入未在以后选择中反映

时间:2016-07-27 07:18:14

标签: sql database hibernate

我正在使用JSF和Hibernate开发一个Web应用程序,我遇到了Hibernate的问题。在某些时候,我想在表中插入一行。就在那之后,我想要检索同一个表中最后插入的3个元素。问题是INSERT是正确的(我用DB Client检查过),但是当我尝试检索这3个元素时,我刚刚插入的那个元素没有被SELECT语句返回。这似乎是一种休眠会话问题,而不是在我做SELECT时反映出这种变化。我附上了代码的相关部分:

hibernate.cfg.xml中:

<hibernate-configuration>
   <session-factory>
       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
       <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/habana</property>
       <property name="hibernate.connection.username">root</property>
       <property name="connection.password"></property>
       <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

       <property name="current_session_context_class">thread</property>
       <property name="show_sql">true</property>

       <property name="hibernate.cache.use_second_level_cache">false</property>
       <property name="hibernate.cache.use_query_cache">false</property>

       <mapping class="org.blk.lahabana.model.ClaseMovimiento"/>
       <mapping class="org.blk.lahabana.model.Devolucion"/>
       <mapping class="org.blk.lahabana.model.DevolucionProducto"/>
       <mapping class="org.blk.lahabana.model.DevolucionProductoId"/>
       <mapping class="org.blk.lahabana.model.Evento"/>
       <mapping class="org.blk.lahabana.model.Movimiento"/>
       <mapping class="org.blk.lahabana.model.Pedido"/>
       <mapping class="org.blk.lahabana.model.PedidoProducto"/>
       <mapping class="org.blk.lahabana.model.PedidoProductoId"/>
       <mapping class="org.blk.lahabana.model.Permiso"/>
       <mapping class="org.blk.lahabana.model.Producto"/>
       <mapping class="org.blk.lahabana.model.TipoProducto"/>
       <mapping class="org.blk.lahabana.model.Trabajador"/>
       <mapping class="org.blk.lahabana.model.Turno"/>
       <mapping class="org.blk.lahabana.model.TurnoTrabajador"/>
       <mapping class="org.blk.lahabana.model.TurnoTrabajadorId"/>
       <mapping class="org.blk.lahabana.model.Usuario"/>

   </session-factory>
</hibernate-configuration>

的HibernateUtil:

public class HibernateUtil {

    /** Logger for this class and subclasses */
   protected static final Log logger = LogFactory.getLog(HibernateUtil.class);

    private static SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().configure()
                    .buildSessionFactory();
        } catch (Throwable ex) {
            logger.error("Error al crear el sessionFactory de Hibernate",ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        // Alternatively, we could look up in JNDI here
        return sessionFactory;
    }

    public static void closeSession() {
        // Close caches and connection pools
        getSessionFactory().close();
    }

}

EventsController:

public String create(){
       String view = "";

       Integer id = eventosService.createEvent(evento);

       if(id !=null){
            FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Evento Guardado", "El evento se ha guardado con éxito");
            FacesContext.getCurrentInstance().addMessage(null, facesMsg);
       }
       else{
           FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Evento No Guardado", "Se ha producido un error al guardar el evento");
            FacesContext.getCurrentInstance().addMessage(null, facesMsg);
       }

       view = dashboardController.input();

       return view;
   }

@Override
    public Integer createEvent(Evento event) {
        Integer result = null;
        event.setEstado(Constants.EVENT_STATE_PLANED);

        boolean saved = eventoDao.save(event);
        if( saved ){
            result = event.getId();
        }

        return result;
    }

public boolean save(T entity) {
       Session hbsession = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction transaction = null;
        boolean result = false;
        try {
            transaction = hbsession.beginTransaction();
            hbsession.save(entity);
            hbsession.flush();
            transaction.commit();
            result = true;
        } catch (HibernateException e) {
            logger.error("Error al guardar una entidad entidad",e);
            if(transaction != null){
                transaction.rollback();
            }
        }
        finally{
            if(hbsession != null && hbsession.isOpen()){
                hbsession.close();
            }
        }

       return result;
   }

DashboardController:

public String input(){
       String view = "dashboard";

       // Obtenemos los útimos eventos
       List<Evento> events = eventosService.getLastEvents();
       // Convertimos los eventos al VO para la vista
       this.lastEvents = new ArrayList<EventoResumenVO>();
       for (Evento evento : events) {
            this.lastEvents.add(eventoResumenConverter.convertFromEvent(evento));
        }

       return view;
   }


@Override
    public List<Evento> getLastEvents() {
        return eventoDao.findLastEvents(3); 
    }


@SuppressWarnings("unchecked")
    @Override
    public List<Evento> findLastEvents(Integer number) {
        Session hbsession = HibernateUtil.getSessionFactory().getCurrentSession();

        Transaction transaction = null;
        List<Evento> result = null;
        try {
            transaction = hbsession.beginTransaction();
            Criteria criteria = hbsession.createCriteria(entityClass);
            criteria.setFetchMode("movimientos", FetchMode.JOIN);
            criteria.addOrder(Order.desc("fechaFin"));
            criteria.setMaxResults(number.intValue());
            result = criteria.list();
        } catch (HibernateException e) {
            logger.error("Error al recuperar la lista de entidades",e);
            if(transaction != null){
                transaction.rollback();
            }
        }
        finally{
            if(hbsession != null && hbsession.isOpen()){
                hbsession.close();
            }
        }

       return result;
    }

感谢您的帮助!

0 个答案:

没有答案