Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я также конвертирую объекты спящего режима в JSON.

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

hSession.setDefaultReadOnly(true);

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

Ответ 3

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

StatelessSession session = sessionFactory.openStatelessSession();

вместо

Session session = sessionFactory.getCurrentSession();

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

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

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

Здесь вы можете узнать больше о разных типах сеансов:

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

Ответ 4

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

Ответ 5

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
второй: изменить поля
затем: сделайте все, что вы хотите сделать