是否可以分离Hibernate实体,以便对对象的更改不会自动保存到数据库?

问题描述 投票:0回答:6

我有 Hibernate 实体,我必须将其转换为 JSON,并且我必须翻译实体中的一些值,但是当我翻译值时,这些值会立即保存到数据库中,但我不想将这些更改保存到数据库中。有没有办法解决这个问题?

java hibernate persistence
6个回答
56
投票

您可以通过调用

Session.evict()
来分离实体。

如果是 JPA,您可以使用:

EntityManager.detach(object)

其他选项是在转换值之前创建实体的防御副本,或者使用 DTO 而不是该代码中的实体。我认为这些选项更优雅,因为它们不耦合到 JSON 和持久层的转换。


4
投票

我还将 hibernate 实体转换为 JSON。

不好的事情是,当您关闭会话时,您无法延迟加载对象。因此您可以使用

hSession.setDefaultReadOnly(true);

完成 JSON 后关闭会话。


3
投票

您还可以通过使用

StatelessSession
:

来避免您的实体附加到 Hibernate 会话
StatelessSession session = sessionFactory.openStatelessSession();

而不是

Session session = sessionFactory.getCurrentSession();

请注意,与常规 Hibernate 会话不同,您必须自行关闭

StatelessSession

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

与常规会话相比的另一个区别是

StatelessSession
无法获取集合。我发现它的主要目的是仅获取数据
SQLQuery
之类的东西。

您可以在此处阅读有关不同会话类型的更多信息:

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


2
投票

关闭会话。 这将为您分离您的实体,并且不会刷新任何修改。 如果这不可能,请考虑禁用 autoFlush...但这完全是另一回事。 最简单的方法是关闭会话并完成它!


0
投票

就我而言,我只是刷新并清除了会话。

session.flush(); 会话.clear();


-1
投票
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;
    }
}

首先:深度克隆会话 pojo
第二:更改字段
然后:做你想做的事

© www.soinside.com 2019 - 2024. All rights reserved.