请教一个有关bibernate的session的问题

09-08-05 ynwso
    

我在项目中碰到一个这样的问题。在服务层使用dao取得了对象,然后再取对象中的子对象时出现session已关闭(使用了延时加载)。

我查了相关资料,发现解决方法一般是:

1.使用opensessioninview模式

2.在dao里面查数据时将要关联的对象fetch出来。

3.将事务配置到service的代理中(原来我是只配了dao的代理),这样session就不会在查询完数据后就关闭了。

我感觉这些方式都不是很好。

请高手指点一下。谢谢!

    

banq
2009-08-05 10:45

都觉得不好,可使用JPA(Hibernate实现)。不过lazy load问题还是一样的:

http://timepedia.blogspot.com/2009/08/on-reducing-size-of-compressed.html

这篇文章提出解决JPA的LazyInitializationExceptions or NullPointerExceptions问题,因为事务关闭后,就不能再访问那些Lazy load的对象,如果访问,就报这些错误,解决办法有两个:

1. 构造一个DTO,这个我不赞成,违反MDD Evans DDD设计

2. 使用open session in View, 又回到老问题,这个会污染表现层。

Jdon+Hibernate的close session in view也可以参考一下。

[该贴被banq于2009-08-19 14:41修改过]