hibernate的get(java.lang.Class arg0, java.io.Serializable arg1) 续

来源:互联网 发布:对编程的认识与看法 编辑:程序博客网 时间:2024/05/24 02:39

上一篇写了hibernate在缓存中找不到对象的时候,去数据库查询。

但是上一篇中   Group gg2=(Group)session.get(Group.class, id2);时候,只会产生 select group0_.id as id3_0_, group0_.name as name3_0_ from t_group group0_ where group0_.id=?,

当 System.out.println("gg2size---"+gg2.getUsers().size());时候才发出select users0_.groupId as groupId1_, users0_.id as id1_, users0_.id as id4_0_,users0_.name as name4_0_, users0_.groupId as groupId4_0_ from t_user users0_  where users0_.groupId=?

得到gg2的属性users的值。

为什么一开始Group gg2=(Group)session.get(Group.class, id2);就得不到属性users对应的t_user表里的值呢?

之前一直以为是set标签里inverse="true"的原因,后来在set 标签里加了lazy="false" ,即

Group.hbm.xml改为

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate">
 <class name="Group" table="t_group">
  <id name="id" type="int" column="id">
   <generator class="native"></generator>
  </id>
  <property name="name" type="string" column="name"></property>
  
  <set name="users" inverse="true" lazy="false">
   <key column="groupId" > </key>
   <one-to-many class="com.hibernate.User"/>
  </set>
  
 </class>
  
</hibernate-mapping>

 

此时我再执行上篇文章的测试类方法:

后台得到:
Hibernate: select hibernate_sequence.nextval from dual
id--99
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into t_group (name, id) values (?, ?)
Hibernate: insert into t_group (name, id) values (?, ?)
Hibernate: insert into t_user (name, groupId, id) values (?, ?, ?)
Hibernate: insert into t_user (name, groupId, id) values (?, ?, ?)
name---g1
s---0
id2--99
Hibernate: select group0_.id as id3_0_, group0_.name as name3_0_ from t_group group0_ where group0_.id=?
Hibernate: select users0_.groupId as groupId1_, users0_.id as id1_, users0_.id as id4_0_, users0_.name as name4_0_, users0_.groupId as groupId4_0_ from t_user users0_ where users0_.groupId=?
gg2name---g1
gg2size---1

可以看出此时执行 Group gg2=(Group)session.get(Group.class, id2);是会产生

Hibernate: select group0_.id as id3_0_, group0_.name as name3_0_ from t_group group0_ where group0_.id=?
Hibernate: select users0_.groupId as groupId1_, users0_.id as id1_, users0_.id as id4_0_, users0_.name as name4_0_, users0_.groupId as groupId4_0_ from t_user users0_ where users0_.groupId=?

一次从数据库中得到gg2的所有属性的值。

 

总结:

inverse 只是影响两张表外键的值。

lazy影响一方查询时是不是立即到多方的数据库里查询。这就是经常说的懒加载,不是说不加载,而是说延迟加载,用到的时候加载。

上篇文章set标签里没有设置lazy默认的值应该是true。执行了懒加载。


 

原创粉丝点击