java sql变更存储,java-是否可以分离Hibernate实体,以使对对象的更改不会自动保存到数据库?...

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值