java-是否可以分离Hibernate实体,以使对对象的更改不会自动保存到数据库?
我有必须转换为JSON的Hibernate实体,并且必须转换实体中的某些值,但是当我转换值时,这些值会立即保存到数据库中,但我不想将这些更改保存到数据库中。 这个问题有什么解决方法吗?
5个解决方案
44 votes
您可以通过调用Session.evict()分离实体。
其他选择是在转换值之前为您的实体创建防御性副本,或者在该代码中使用DTO代替实体。 我认为这些选项更优雅,因为它们不将转换转换为JSON和持久层。
axtavt answered 2020-01-21T09:31:36Z
3 votes
我还将休眠实体转换为JSON。
不好的事情是,当您关闭会话时,您无法延迟加载对象。 因此,您可以使用
hSession.setDefaultReadOnly(true);
并在完成JSON之后关闭会话。
elkarel answered 2020-01-21T09:32:05Z
3 votes
您还可以通过使用StatelessSession避免将实体附加到休眠会话:
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/]
yglodt answered 2020-01-21T09:32:47Z
0 votes
关闭会话。 这将为您分离实体,并且不会清除任何修改。 如果那不可能,请考虑禁用autoFlush ...但是那完全是另一种蠕虫病毒。 最简单的方法是关闭会话并完成它!
stevevls answered 2020-01-21T09:33:08Z
0 votes
public static 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
第二:更改字段
然后:做任何你想做的事
helloworld1970 answered 2020-01-21T09:33:36Z