一般来说如果你是主外键关联的话,比如想要主键表的2个字段,外键表的3个字段,这样你可以使用"延迟加载".这个主要就是来解决在表关联时,不装载不需要的数据的技术(因为表关联多的时候,所有对象都装载是很消耗资源的).你可以在google上搜索一下,估计能出来不少关于它的资料的.

解决方案 »

  1.   

    谢谢!请问写法是什么样子的呢?
    比如Criteria criteria=session.createCriteria(User.class);
    这样返回的是User表的所有字段了,怎么让它返回我需要的字段呢,比如userName和password
      

  2.   

    [引用]众所周知,到了Hibernate3.0以后,关联关系的对象默认都是使用延迟加载,例如<one-to-many>时.但我在映射<one-to-one>,<many-to-one>关系时指定了lazy="true",但是在查询对象时,我只想查询一个对象,仍然会把这个对象所关联的<one-to-one>,<many-to-one>对象一起查询出来,这样造成了极大的性能浪费.在不指定lazy属性时,<many-to-one>所关联的对象反而会延迟加载,这让我大为困惑,还以为是Hibernate的bug. 
    在网上查找资料,说在为了延迟加载<one-to-one>,<many-to-one>所关联的对象,需要设置被关联的对象<class name="" lazy="true">,我也这样做了,但是仍然没有效果. 
    仔细阅读了Hibernate的手册,才发现原来要延迟加载<one-to-one>,<many-to-one>所关联的对象时,除了要指定lazy="true"外,还需要运行期字节码增强,而我省去了这一步,所以延迟加载没有效果.同时还发现在默认情况下,<one-to-one>,<many-to-one>的lazy属性是"proxy"而不是"true"!因此如果直接采用lazy的默认值,是可以延迟加载的. 
    总结一下: 
    <many-to-one>默认的属性是lazy="proxy",此时默认是会延迟加载的.在指定了lazy="true"之后,必须要经过运行期字节码增加,延迟加载才有效果. 
    而<one-to-one>相对要复杂一点,延迟加载还要受到constrained属性的限制.constrained="false"时表明实体和被关联到的实体的约束不是强制的,即存在一个实体时,它通过<one-to-one>关联的实体可能存在,也可能不存在,这时在查询实体时,Hibernate总会发起一次查询检查<one-to-one>所关联的实体是否存在,而这时已经可以把one-to-one关联的实体查询出来了,因此在<one-to-one>关系中,如果constrained="false",总是会立即加载关联到的实体. 
    如果当constrained="true",且lazy="proxy"(默认),是可以延迟加载的. 
    如果当constrained="true",且lazy="true"时,需要经过运行期字节码增加,延迟加载才会奏效.
      

  3.   

    使用hibernate后,观念应该转变过来, 一个对象应该是完整, 所以没法返回一个只包含某几个属性(字段) 的对象。 例如,一个人,就不能只返回一个头, 还是手什么的
     如果数据量过大, 当然还是有这个必要. 也可以做到, 但是返回的不会是对象,而是字段数组.
     hibernate 管这叫投影
      Criteria criteria=session.createCriteria(User.class);  ProjectionList proList = Projections.projectionList();//设置投影集合
            proList.add(Projections.groupProperty("userName"));
            proList.add(Projections.groupProperty("password"));  criteria.setProjection(proList);
      
      最后返回的List是 Object[] , [0] = userName, [1] = password如果你真的只用来查 userName,password, 那就小题大做了
      

  4.   

    非常感谢两位,特别是aChinese,你讲的东西正是我需要的,javapassion说的也让我拓展了思路,虽然不是我想得到的答案,呵呵。顺便再问aChinese最后一个问题:
    如果我自己定义了一个java bean 用来存放userName和password,那么我还应该怎么做呢?谢谢
      

  5.   

    我的意思是我想直接取出view(String userName,String password)的形式,
    即hql:select new view(userName,password) from ....
      

  6.   

    两种方法
    1 属性的延迟载入 
       在hbm.xml的属性上加 lazy=true
    2 轻量设计
      单独设计一个类, 只包含 userName 和password
      

  7.   

    aChinese的方法很不错,说实话,头一次见,呵呵!UP!
    学到东西了!
      

  8.   

    对的,我的意思就是设计了一个类用来存放username和password,但是Criteria能返回这个bean类型的一个List吗?
      

  9.   

    也要为这个类写一个 映射, 然后 createCriteria(这个类)  就当然会返回这个类的List
      

  10.   

    那么这个类的.hbm.xml中要怎么写?因为不存在这个表啊!!!!
      

  11.   

    ..你怎么同时在一个xml里面映射两张表的字段?
      

  12.   

    再写一个xml啊, 没人规定一张表只能映射一次
      

  13.   

    轻量的employee映射
    <hibernate-mapping package="firsthibernate">    <class name="EmployeeLight" table="employee" dynamic-update="true" polymorphism="explicit">
    <cache usage="read-write"/>        <id name="emp_id" type="string" unsaved-value="null" >
        <generator class="assigned"/>
            </id>        <property name="fname" column="fname"/>
            <property name="lname"/>    </class></hibernate-mapping>重量的employee映射
    <hibernate-mapping package="firsthibernate">    <class name="Employee" table="employee" dynamic-update="true">
    <cache usage="read-write"/>        <id name="emp_id" type="string" unsaved-value="null" >
        <generator class="assigned"/>
            </id>        <property name="fname" column="fname"/>
            <property name="lname"/>
            <property name="hire_date"/>
    <!--        <many-to-one name="job" class="Job" column="job_id" fetch="join"/>-->
    <many-to-one name="job" class="Job" column="job_id"/>
        </class></hibernate-mapping>
    轻的employee类
    public class EmployeeLight
        implements Serializable {
      String emp_id;
      String fname;
      String lname;
      public boolean equals(Object obj) {
        return this.emp_id.equals(
          ((EmployeeLight)obj).emp_id);
      }  public int hashCode() {
        return this.emp_id.hashCode();
      }
      public String getEmp_id() {
        return emp_id;
      }
      public String getFname() {
        return fname;
      }
      public String getLname() {
        return lname;
      }
      public void setEmp_id(String emp_id) {
        this.emp_id = emp_id;
      }
      public void setFname(String fname) {
        this.fname = fname;
      }
      public void setLname(String lname) {
        this.lname = lname;
      }}
    重的employee类,可以继承轻的public class Employee extends EmployeeLight {
      Date hire_date;
      Job job;  public Date getHire_date() {
        return hire_date;
      }
      public Job getJob() {
        return job;
      }
      public void setHire_date(Date hire_date) {
        this.hire_date = hire_date;
      }
      public void setJob(Job job) {
        this.job = job;
      }
    }
      

  14.   

    谢aChinese了,学到东西就是好!哈哈