我有 Hibernate 实体,我必须将其转换为 JSON,并且我必须翻译实体中的一些值,但是当我翻译值时,这些值会立即保存到数据库中,但我不想将这些更改保存到数据库中。有没有办法解决这个问题?
Session.evict()
来分离实体。
EntityManager.detach(object)
其他选项是在转换值之前创建实体的防御副本,或者使用 DTO 而不是该代码中的实体。我认为这些选项更优雅,因为它们不耦合到 JSON 和持久层的转换。
我还将 hibernate 实体转换为 JSON。
不好的事情是,当您关闭会话时,您无法延迟加载对象。因此您可以使用
hSession.setDefaultReadOnly(true);
完成 JSON 后关闭会话。
您还可以通过使用
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
之类的东西。
您可以在此处阅读有关不同会话类型的更多信息:
关闭会话。 这将为您分离您的实体,并且不会刷新任何修改。 如果这不可能,请考虑禁用 autoFlush...但这完全是另一回事。 最简单的方法是关闭会话并完成它!
就我而言,我只是刷新并清除了会话。
session.flush(); 会话.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;
}
}
首先:深度克隆会话 pojo
第二:更改字段
然后:做你想做的事