您的位置:首页 > 其它

关于hibernate的load()方法的相关实验

2012-04-15 10:32 344 查看
定义一个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驱动包实现上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: