hibernate级联查询

今天研究了一下Hibernate的级联查询。用MyEclipse的Hibernate模式生成pojo和xml文件挺方便的,但是级联查询会导致多次查询操作,有些影响效率呀!
一、数据库表结构
1、用户组表:
]create table SXF_GROUP
(
  ID   NUMBER(10) not null,
  NAME VARCHAR2(32)
)

2、用户表
create table SXF_USERS
(
  ID      NUMBER(10) default 1 not null,
  NAME    VARCHAR2(20),
  PASSWD  VARCHAR2(15),
  GROUPID NUMBER(10)
)

二、生成的配置文件(pojo略)
<class name="teststruts2.third.pojo.SxfGroup" table="SXF_GROUP" schema="SHENGTC">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="10" scale="0" />
            <generator class="sequence" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="32" />
        </property>
        <set name="sxfUserses" inverse="true">
            <key>
                <column name="GROUPID" precision="10" scale="0" />
            </key>
            <one-to-many class="teststruts2.third.pojo.SxfUsers" />
        </set>
    </class>

<class name="teststruts2.third.pojo.SxfUsers" table="SXF_USERS" schema="SHENGTC">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="10" scale="0" />
            <generator class="sequence" />
        </id>
        <many-to-one name="sxfGroup" class="teststruts2.third.pojo.SxfGroup" fetch="select">
            <column name="GROUPID" precision="10" scale="0" />
        </many-to-one>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="20" unique="true" />
        </property>
        <property name="passwd" type="java.lang.String">
            <column name="PASSWD" length="15" />
        </property>
    </class>

三、java查询代码
//action代码
List list = userServ.queryAllUsers();
		for(Object obj : list){
			SxfUsers user2 = (SxfUsers)obj;
			System.out.println(user2.getSxfGroup().getName());
			System.out.println(user2.getSxfGroup().getId());
		}

//dao代码
Query query = this.getSession().createSQLQuery("select * from SXF_USERS").addEntity(SxfUsers.class);
			list = query.list();

四、后台日志
Hibernate: select * from SXF_USERS
Hibernate: select sxfgroup0_.ID as ID1_0_, sxfgroup0_.NAME as NAME1_0_ from SHENGTC.SXF_GROUP sxfgroup0_ where sxfgroup0_.ID=?
测试
1
Hibernate: select sxfgroup0_.ID as ID1_0_, sxfgroup0_.NAME as NAME1_0_ from SHENGTC.SXF_GROUP sxfgroup0_ where sxfgroup0_.ID=?
开发
2

发现了没有,action里每调用一次getSxfGroup()方法,就执行一次数据库查询。如果直接写原生态sql语句一条sql就搞定了。
select t1.*,t2.name groupname 
from sxf_users t1, sxf_group t2
where t1.groupid = t2.id
Hibernate的效率是不是有问题呢?

你可能感兴趣的:(Hibernate)