java – Hibernate急切加载(获取所有属性不起作用)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Hibernate急切加载(获取所有属性不起作用),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2827字,纯文字阅读大概需要5分钟。
内容图文
![java – Hibernate急切加载(获取所有属性不起作用)](/upload/InfoBanner/zyjiaocheng/807/7cdb3cecd11c427eb5a4a42d6d5dc0ac.jpg)
基本上我想要加载属性.我有以下HQL查询:
SELECT u.id AS id, u.name AS text, u AS obj FROM User AS u fetch all properties
我希望这只执行一个查询.相反,我得到了N 1个查询.
代码如下:
Query q = mySession.createQuery(
"SELECT u.id AS id, u.name AS text, u AS obj FROM User AS u fetch all properties")
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
for (Iterator i = q.iterate(); i.hasNext();) {
Object line = i.next();
System.out.println(line);
}
我得到的输出(hibernate.show_sql设置为true)是:
Hibernate: select user0_.id as col_0_0_, user0_.name as col_1_0_, user0_.id as col_2_0_ from user user0_
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.location as location0_0_ from user user0_ where user0_.id=?
{id=1, obj=User@b6548 [id='1' name='John' ], text=John}
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.location as location0_0_ from user user0_ where user0_.id=?
{id=2, obj=User@4865ce [id='2' name='Arnold' ], text=Arnold}
Ps:没有变形金刚的情况也是如此.
编辑:
具有实体映射的文件:
<hibernate-mapping>
<class name="User" table="user">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="location"/>
<map name="customPrices" table="custprice">
<key column="user"/>
<map-key-many-to-many column="product" class="Product"/>
<element column="price" type="double"/>
</map>
</class>
<class name="Product" table="product">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="listprice"/>
</class>
</hibernate-mapping>
我尝试将lazy =“false”添加到类和各个属性中.没有不同.
我的配置文件:
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://192.168.0.203/hibtest</property>
<property name="connection.username">hibtest</property>
<property name="connection.password">hibb345</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="combined.hbm.xml" />
</session-factory>
</hibernate-configuration>
EDIT2:
即使以下代码也会导致N 1查询.虽然我只获取ID字段,但根据文档不应该导致加载对象.
for (Iterator i = q.iterate(); i.hasNext();) {
Object line = i.next();
User u = (User)((Map)line).get("obj");
System.out.println(u.getId());
}
解决方法:
问题出在.iterate()上.根据Hibernate API docs:
Entities returned as results are initialized on demand. The first SQL query returns identifiers only.
当我们期望生成的对象已经被缓存时,这是一个特殊的函数.访问时它们将被(懒惰)加载.
因此,对于一般用途,要在查询结果上获取迭代器,您应该使用.list().iterate().
感谢Eran Harel的帮助.
内容总结
以上是互联网集市为您收集整理的java – Hibernate急切加载(获取所有属性不起作用)全部内容,希望文章能够帮你解决java – Hibernate急切加载(获取所有属性不起作用)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。