碰到的一个Hibernate的问题

也不知道算不算问题,只是感觉有那么一点奇怪...
在OSIV情况下编写的一个测试类,其中的代码是这样的:
1Test test=new Test();
2dao.save(test);
3Test testChild=new Test();
4testChild.setParent(test);
5dao.save(testChild);
6Test resultTest=(Test)dao.getById(Test.class, test.getId());
Test本身是个自关联,映射文件如下:
<class
       
name="dataset.component.metadata.display.Test"
       table
="T_Test"
       dynamic-update
="true"
   
>

       
<id
           
name="id"
           column
="id"
           type
="int"
       
>
           
<generator class="native">
           
</generator>
       
</id>

       
<set
           
name="childs"
           table
="T_Test"
           lazy
="true"
           cascade
="delete"
           sort
="unsorted"
       
>

           
<key
               
column="parentId"
           
>
           
</key>

           
<one-to-many
                 
class="dataset.component.metadata.display.Test"
           
/>

       
</set>

       
<many-to-one
           
name="parent"
           class
="dataset.component.metadata.display.Test"
           cascade
="none"
           outer-join
="auto"
           update
="true"
           insert
="true"
           column
="parentId"
       
/>

   
</class>

因为是open session in view,所以session是在代码执行完毕后关闭的;
在这种情况下执行resultTest.getChilds()返回的是null。
调试的时候dao.getById执行完毕后取回的resultTest和之前的test是同一个对象,hashcode都是一样的..
于是便尝试在dao.getById之前把session关闭,这个时候再执行发现resultTest.getChilds()就是正确的了..
总结,就是在同一个session内如果save了一个对象,再通过session.load的方式去取这个对象取出的将仍然是当前session中的对象,也就是说不会去数据库中重新获取...
怎么感觉这样是不太对的,明明数据库有改变,却没有去重新的加载...
但因为open session in view是这么做的,所以现在干脆测试的时候就使用另外一个dao了,唯一的不同就是这个dao会即时的关闭session,大家有没有别的什么好建议,^_^

posted on 2006-02-24 20:05 BlueDavy 阅读(1698) 评论(6)  编辑  收藏 所属分类: Java

评论

# re: 碰到的一个Hibernate的问题 2006-02-24 20:56 Vincent Thinking

^_^,因为Session本身一级缓存,由于OSIV取的同一个session,所以是同一个对象。save(test)后,test已经从pojo转变为po,任何po的改动都会同步到数据库,但是代码中仅仅是testChild.setParent(test),而没有test.addChild(testChild),所以仅仅是testChild发生了变化,test没有任何改动,session中仍然保存的是以前的test。重新开一个session会读取会得到带有child的test,或者用get()方法。  回复  更多评论   

# re: 碰到的一个Hibernate的问题 2006-02-26 10:07 Asktalk

看一下它,对你有帮助,http://www.blogjava.net/asktalk/archive/2006/01/18/28548.html  回复  更多评论   

# re: 碰到的一个Hibernate的问题 2006-02-26 16:45 BlueDavy

恩,多谢asktalk,^_^  回复  更多评论   

# re: 碰到的一个Hibernate的问题 2006-02-28 08:20 aycl

在 dao.getById(..) 前叫: session.clear() 或 session.evict(test). 可清理一級緩存, 迫 hibernate 重新讀取.


  回复  更多评论   

# re: 碰到的一个Hibernate的问题 2006-02-28 09:27 BlueDavy

恩,已经这么做了,多谢,^_^  回复  更多评论   

# re: 碰到的一个Hibernate的问题 2006-03-10 13:47 Tin

可以用session.refresh()进行强行读取就OK了。
我么项目的Category也是自影射,修改完以后child就没有了。只要refresh一下就OK了。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

 









feedsky
抓虾
google reader
鲜果

导航

<2006年2月>
2930311234
567891011
12131415161718
19202122232425
2627281234
567891011

统计

随笔分类

随笔档案

文章档案

Blogger's

搜索

最新评论

阅读排行榜

评论排行榜