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

时间:2011-04-27 07:32:56

标签: java hibernate persistence

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

6 个答案:

答案 0 :(得分:44)

您可以通过致电Session.evict()来分离实体。

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

答案 1 :(得分:3)

我也将hibernate实体转换为JSON。

当您关闭会话时,您不能延迟加载对象。因此,您可以使用

hSession.setDefaultReadOnly(true);

并在完成JSON后关闭会话。

答案 2 :(得分: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/

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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
第二:改变字段
那么:做你想做的事

答案 5 :(得分:0)

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

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