2016-08-25 76 views
1
Criteria crit = sess.createCriteria(Cat.class); 
crit.setMaxResults(50); 
List cats = crit.list(); 

cats变成当前会话的持久对象sessHibernate标准加载对象,会使对象变成持久性的吗?

我查了API,但没有提及任何东西。我非常担心这一点,所以我希望我能找到某处正式提及对象是否会持久化,当我第一次使用Hibernate的session加载对象时,我不知道该对象变为持久对象,并且我意外修改了值在对象内部,更改会刷新到数据库,这对我来说会造成很大的问题。

在此基础上https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

org.hibernate.Criteria接口表示反对 特定持久类的一个查询。

是否表示返回的对象是持久对象?我可以安全地更改对象内的值吗?

如果对象不会是持久的,为什么有一个setReadOnly属性来控制的API文档:

设置只读/修改模式,通过 这个标准装载实体和代理。此设置将覆盖 持久性上下文的默认设置。

以上我很困惑!

回答

1

它会在当前会话中持续存在。如果您更改对象值并刷新,则在事务结束时将其保存到数据库中。检查https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/objectstate.html段落10.4.1。执行查询

查询通常通过调用list()来执行。 查询的结果将被完全加载到内存中的一个集合中。由查询检索的实体 处于持久状态。

+0

这太糟糕了......你知道我怎样才能通过Hibernate获取数据,但他们不处于持久状态?这是非常危险的,如果有人不知道并意外地冲洗它... – GMsoF

+0

从会话分离对象或使session.setDefaultReadOnly(true)。详细的选项可以发现:http://stackoverflow.com/questions/5800814/is-it-possible-to-detach-hibernate-entity-so-that-c​​hanges-to-object-are-not-aut – Justas

+0

谢谢你分享。太糟糕了,如果我们总是需要在数据加载后分离,那太麻烦了。使用'setDefaultReadOnly'将删除所有的持久对象,而不是特定的对象。除此之外,hibernate没有任何加载数据的方法会自动变成非持久对象? – GMsoF