Можно ли отсоединить сущность Hibernate, чтобы изменения в объекте не сохранялись автоматически в базе данных? - PullRequest
51 голосов
/ 27 апреля 2011

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

Ответы [ 5 ]

44 голосов
/ 27 апреля 2011

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

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

3 голосов
/ 07 марта 2016

Вы также можете избежать привязки ваших сущностей к Сессии 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/

3 голосов
/ 23 февраля 2013

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

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

hSession.setDefaultReadOnly(true);

и закройте сеанс после завершения работы с JSON.

0 голосов
/ 17 апреля 2017
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;
    }
}

first: deepClone сеанс pojo
second: изменить поля
затем: делать все, что вы хотите

0 голосов
/ 27 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...