¿Es posible separar la entidad de hibernación, para que los cambios en el objeto no se guarden automáticamente en la base de datos?


Tengo entidad de hibernación que tengo que convertir a JSON, y tengo que traducir algunos valores en entidad, pero cuando traduzco valores, estos valores se guardan instantáneamente en la base de datos, pero no quiero guardar estos cambios en la base de datos. ¿Hay alguna solución para este problema?

Author: newbie, 2011-04-27

5 answers

Se puede separar una entidad llamando Session.evict().

Otras opciones son crear una copia defensiva de su entidad antes de la traducción de valores, o usar un DTO en lugar de la entidad en ese código. Creo que estas opciones son más elegantes, ya que no combinan la conversión a JSON y la capa de persistencia.

 39
Author: axtavt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-25 15:10:30

También estoy convirtiendo entidades hibernadas a JSON.

Lo malo cuando cierra la sesión no puede cargar objetos perezosos. Por esta razón se puede utilizar

hSession.setDefaultReadOnly(true);

Y cierra la sesión cuando hayas terminado con el JSON.

 3
Author: elkarel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-22 20:46:47

También puede evitar que sus entidades se adjunten a la sesión de Hibernación utilizando un StatelessSession:

StatelessSession session = sessionFactory.openStatelessSession();

En lugar de

Session session = sessionFactory.getCurrentSession();

Tenga en cuenta que debe tener cuidado de cerrar la StatelessSession, a diferencia de la sesión de hibernación regular:

session.close(); // do this after you are done with the session

Otra diferencia en comparación con la sesión regular es que un StatelessSession no puede obtener colecciones. Veo que es el propósito principal para obtener solo datos SQLQuery cosas.

Puede leer más sobre los diferentes tipos de sesiones aquí:

Http://www.interviewadda.com/difference-between-getcurrentsession-opensession-and-openstatelesssession/

 3
Author: yglodt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-25 12:02:44

Cierre la sesión. Eso separará tu entidad por ti, y ninguna modificación será eliminada. Si eso no es posible, busca desactivar la autoFlush...pero eso es otra lata de gusanos. La forma más fácil es cerrar la Sesión y listo!

 0
Author: stevevls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-27 07:37:24
public static <E> E deepClone(E e) {
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ObjectOutputStream oo;
    try {
        oo = new ObjectOutputStream(bo);
        oo.writeObject(e);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
    ObjectInputStream oi;
    try {
        oi = new ObjectInputStream(bi);
        return (E) (oi.readObject());
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
        return null;
    }
}

Primero: deepClone la sesión pojo
segundo: alter fields
entonces: haz lo que quieras hacer

 0
Author: helloworld1970,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-17 04:25:54