一般来说如果你是主外键关联的话,比如想要主键表的2个字段,外键表的3个字段,这样你可以使用"延迟加载".这个主要就是来解决在表关联时,不装载不需要的数据的技术(因为表关联多的时候,所有对象都装载是很消耗资源的).你可以在google上搜索一下,估计能出来不少关于它的资料的.
解决方案 »
- xfire自定义对象传参、返回值均为null
- tomcat发布webservice抛出异常
- 在SQL server 2000 运行的项目 如果要在SQL server2005 运行 需改动哪些地方
- 原来AJAX就是阿贾克斯,我喜欢
- 我昨天装了JCreator,测试的时候,少了包javax.ejb,怎么办?
- netbean的配置问题
- 要生成一个xml文件,已知dtd,并把生成的这个文件传到指定的url,用java怎么做?给个思路或例子?实际上是用xml文件传输东西。万分感谢,在
- 我的第一个超简单EJB,被打击到了,大家帮忙啊。
- 大家听说过深圳博科信息产业有限公司吗?最好有在里面上班的大哥说说情况阿(给100)
- 请问作过EJB的高手们很简单的配置问题(使用JB)
- struts中关于URL的参数问题
- 在struts中,怎么Client site validation显示空对话框?
比如Criteria criteria=session.createCriteria(User.class);
这样返回的是User表的所有字段了,怎么让它返回我需要的字段呢,比如userName和password
在网上查找资料,说在为了延迟加载<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"时,需要经过运行期字节码增加,延迟加载才会奏效.
如果数据量过大, 当然还是有这个必要. 也可以做到, 但是返回的不会是对象,而是字段数组.
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, 那就小题大做了
如果我自己定义了一个java bean 用来存放userName和password,那么我还应该怎么做呢?谢谢
即hql:select new view(userName,password) from ....
1 属性的延迟载入
在hbm.xml的属性上加 lazy=true
2 轻量设计
单独设计一个类, 只包含 userName 和password
学到东西了!
<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;
}
}