Можно ли отсоединить сущность Hibernate, чтобы изменения в объекте не сохранялись автоматически в базе данных?

У меня есть сущность Hibernate, которую я должен преобразовать в JSON, и мне нужно перевести некоторые значения в сущности, но когда я перевожу значения, эти значения мгновенно сохраняются в базе данных, но я не хочу сохранять эти изменения в базе данных. Есть ли обходной путь для этой проблемы?

6 ответов

Решение

Вы можете отсоединить объект, позвонив Session.evict(),

Другие варианты - создать защитную копию вашей сущности перед преобразованием значений или использовать DTO вместо сущности в этом коде. Я думаю, что эти варианты более элегантны, поскольку они не соединяют преобразование в JSON и постоянный слой.

Я также конвертирую спящие сущности в JSON.

Плохая вещь, когда вы закрываете сеанс, вы не можете лениво загружать объекты. По этой причине вы можете использовать

hSession.setDefaultReadOnly(true);

и закройте сеанс после того, как вы закончите с JSON.

Вы также можете избежать привязки ваших сущностей к сеансу Hibernate, используя StatelessSession:

StatelessSession session = sessionFactory.openStatelessSession();

вместо

Session session = sessionFactory.getCurrentSession();

Обратите внимание, что вы должны позаботиться о закрытии StatelessSessionв отличие от обычного Hibernate Session:

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

Другое отличие по сравнению с обычной сессией в том, что StatelessSession не могу получить коллекции. Я вижу, что это основная цель только для извлечения данных SQLQuery вещи.

Вы можете прочитать больше о различных типах сессий здесь:

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

Закройте сессию. Это отделит вашу сущность от вас, и никакие модификации не будут сброшены. Если это невозможно, посмотрите на отключение автозаполнения... но это еще одна банка червей. Самое простое - закрыть сессию и покончить с этим!

В моем случае я просто промыл и очистил сеанс.

session.flush();session.clear();

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;
    }
}

первый: deepClone сеанс pojo
второе: изменить поля
тогда: делай что хочешь

Другие вопросы по тегам