定义一个Person类:
基本配置:
主键:id
属性:name、age
Person.hbm.xml中主键配置:<id name="id" />
使用时:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,2);
ts.commit();
System.out.println(t.getId());
System.out.println(t);
session.close();
结果:一切正常显示:id:2,并显示代理对象
改一:
使用时:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,2);
ts.commit();
System.out.println(t);
session.close();
System.out.println(t.getId());
结果:一切显示和上面的基本配置一样,这里t.getId()并不从数据库中查询(因为没有看到查询语句显示),本人尝试着将id单独提取并更换为一个拥有两个属性的主键对象后,并在load方法之前为之赋值,则t也可以得到这两个属性。
改二:
使用时:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,2);
ts.commit();
session.close();
System.out.println(t.getId());
System.out.println(t);
结果:出现错误了,但是id可以正常显示
原因:在session中找不到对应的t
观察一二改法本人总结:load(class,args)方法,通过对load方法的参数解析 生成对应class类的子类(并返回这个子类对象作为代理对象,并存储到session中),并通过第二个参数args为代理对象附上主键属性,然后在你需要使用这个代理对象的时候(除开主键属性查询),他会通过它的主键属性在数据库中查询,并存放session中,然后在session中通过主键属性查找相应的对象属性及方法。
改三:
使用时:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,p);
ts.commit();
System.out.println(t.getId());
System.out.println(t);
session.close();
结果:直接报错
改四:
Person.hbm.xml中主键配置:
<composite-id>
<key-property name="id"></key-property>
</composite-id>
使用时:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,p);
ts.commit();
System.out.println(t.getId());
System.out.println(t);
session.close();
结果:又可以正常显示了
以上实现都是在基本配置上修改,使用hibernate4.1.2和mysql5.0及mysql5.1.2驱动包实现上