主表(部门表):Tdept(deptid, deptname)
子表(员工表): Temployee (empid, deptid,empname)员工类 (VO):
class Temployee
private String empid;
private Tdept Tdept;
private String empname; public String getEmpid() {
return this.empid;
} public void setEmpid(String empid) {
this.empid = empid;
} public Tdept getTdept() {
return this.Tdept;
} public void setTdept(Tdept Tdept) {
this.Tdept = Tdept;
} public String getEmpname() {
return this.empname;
} public void setEmpname(String empname) {
this.empname = empname;
}Temployee temp = TemployeeDao.findById("100");
Tdept tdept = temp.getTdept();
tdept.getDeptname();           //执行到这一句出现错误错误信息如下:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session 。不知道是什么原因,难道
Tdept tdept = temp.getTdept();
一句没有获取到Tdept对象实例吗,我其实就是想通过子表去获取主表对象(Tdept), (Tdept的VO和DAO都已经定义好).
不知道通过Temployee员工对象怎么得到它的主表对象其主表中的属性值?

解决方案 »

  1.   

    没有用查询语句,都是配置出来的,Temployee temp = TemployeeDao.findById("100");这一句没有错,且Temployee 对象中的所有属性值都可以获取,但取它的主表Tdept对象中的属性时报错,打印显示 tdept 对象非空,但一用tdept.getDeptname();取属性时就报错!
      

  2.   

    你在hibernate映射文件中有没有写lazy="false"?
    在这里,你查询Temployee 对象时将Tdept的主键放在了缓存当中,你如果设置了lazy="false",
    当你用到得时候它就会在去查数据库,从而拿到你需要的值!
    检查一下你的映射文件,
    在Tdept的java类中,应该有个set容器,存放的是Temployee 对象
      

  3.   

    谢谢以上两位, 我用String deptid = temp.getTdept().getDeptid();
    Tdept tdept=DeptDao.findById(deptid);
    tdept.getDeptname();
    倒是可以取到,好象默认情况下,子对象只取到主表外键值,其它属性值就取不到了.另外试了下smilewmr 同学的方法,非常好用,不用象上面这么麻烦了,在此十分地感谢smilewmr同学帮助.