我有Hibernate实体,我必须转换为JSON,我必须在实体中翻译一些值,但是当我翻译值时,这些值会立即保存到数据库中,但我不想将这些更改保存到数据库。这个问题是否有任何解决方法?
答案 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
。
您可以在此处详细了解不同的会话类型:
答案 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();