Java w会话使对象或实体从一个持久化到另一个?您的解释很好,但如何避免此泄漏?关键是我希望在getListConfigurations()中选择的对象保留在会话(hibernate缓存)中,然后在调用updateConfigurations()时hibernat

Java w会话使对象或实体从一个持久化到另一个?您的解释很好,但如何避免此泄漏?关键是我希望在getListConfigurations()中选择的对象保留在会话(hibernate缓存)中,然后在调用updateConfigurations()时hibernat,java,spring,hibernate,session,Java,Spring,Hibernate,Session,w会话使对象或实体从一个持久化到另一个?您的解释很好,但如何避免此泄漏?关键是我希望在getListConfigurations()中选择的对象保留在会话(hibernate缓存)中,然后在调用updateConfigurations()时hibernate将能够与其缓存进行比较,这将导致1次更新而不是100次更新(意味着我选择的列表包含100个对象),因为我只修改列表中的一个对象,所以我希望hibernate在缓存中查找我修改的对象,然后只更新这个对象。这些对象是脏的,因为它们来自另一个会话。


w会话使对象或实体从一个持久化到另一个?您的解释很好,但如何避免此泄漏?关键是我希望在getListConfigurations()中选择的对象保留在会话(hibernate缓存)中,然后在调用updateConfigurations()时hibernate将能够与其缓存进行比较,这将导致1次更新而不是100次更新(意味着我选择的列表包含100个对象),因为我只修改列表中的一个对象,所以我希望hibernate在缓存中查找我修改的对象,然后只更新这个对象。这些对象是脏的,因为它们来自另一个会话。对于这些对象,Hibernate不做任何假设。您需要启动一个事务,获取所有对象,相应地修改它们,然后提交该事务。这似乎很有帮助,我将搜索如何执行并尝试,之后我将再次更新您,谢谢!不幸的是,我仍然找不到让它像预期的那样工作的方法。。。如果您对代码有任何建议,我将不胜感激。谢谢
SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];...)
public List<SystemConfiguration> getListConfigurations() {
    List<SystemConfiguration> lista = new ArrayList<SystemConfiguration>();
    Session session = null;
    Query query = null;

    String sql = "from SystemConfiguration where description = :desc";
    try {
        /* BEFORE
            session = SessionFactoryUtil.getInstance().getCurrentSession(); 
        @SuppressWarnings("unused")
        Transaction ta = session.beginTransaction(); */
            //FOLLOWING LINE SOLVED THE PROBLEM
            session = SessionFactoryUtil.getInstance().openSession();
        query = session.createQuery(sql);

        query.setString("desc", "configuracion");
        lista = query.list();

        return lista;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}


public void updateConfigurations(List<SystemConfiguration> configs) throws Exception{
        Session sess = null;
        Transaction tx = null;
        try {
                    //BEFORE
            //sess = SessionFactoryUtil.getInstance().getCurrentSession();
                    //FOLLOWING LINE SOLVED THE PROBLEM
                 sess = SessionFactoryUtil.getInstance().openSession(new SystemConfigurationInterceptor());
            tx = sess.beginTransaction();
            for (SystemConfiguration sys : configs) {
                    sess.update(sys);   
            }
            tx.commit();
        } // try
        catch (Exception e) {
            e.printStackTrace();
            if (tx != null && tx.isActive()) {
                tx.rollback();
            } // if
            throw e;
        } 
    }
public class SystemConfigurationInterceptor extends EmptyInterceptor {
            private int updates;
        private int creates;
        private int loads;
        public void onDelete(Object entity,
                             Serializable id,
                             Object[] state,
                             String[] propertyNames,
                             Type[] types) {
            // do nothing
        }

        // This method is called when Entity object gets updated.
        public boolean onFlushDirty(Object entity,
                                    Serializable id,
                                    Object[] currentState,
                                    Object[] previousState,
                                    String[] propertyNames,
                                    Type[] types) {

            if ( entity instanceof SystemConfiguration ) {
                updates++;
                for ( int i=0; i < propertyNames.length; i++ ) {
                    if ( "updated_at".equals( propertyNames[i] ) ) {
                        currentState[i] =  new Timestamp(Calendar.getInstance().getTime().getTime());
                        return true;
                    }
                }
            }
            return false;
        }

        public boolean onLoad(Object entity,
                              Serializable id,
                              Object[] state,
                              String[] propertyNames,
                              Type[] types) {
            if ( entity instanceof SystemConfiguration ) {
                loads++;
            }
            return false;
        }

     // This method is called when Entity object gets created.
        public boolean onSave(Object entity,
                              Serializable id,
                              Object[] state,
                              String[] propertyNames,
                              Type[] types) {

            if ( entity instanceof SystemConfiguration ) {
                creates++;
                for ( int i=0; i<propertyNames.length; i++ ) {
                    if ( "updated_at".equals( propertyNames[i] ) ) {
                        state[i] = new Timestamp(Calendar.getInstance().getTime().getTime());
                        return true;
                    }
                }
            }
            return false;
        }

        public void afterTransactionCompletion(Transaction tx) {
            if ( tx.wasCommitted() ) {
                System.out.println("Creations: " + creates + ", Updates: " + updates +", Loads: " + loads);
            }
            updates=0;
            creates=0;
            loads=0;
        }