精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-08-02
引用 我有一个问题, 如果lazy loading的Collection里的元素, 其本身还有lazy loading的Collection, 那么不用open session in view的话, 如何能够简洁的处理呢? 这个问题确实很难处理,集合中的元素是collection,难道你想让你load的时候把所有的数据装进来?内存会不会耗尽? 如果不用open session in view。我在给你一个更为恐怖的实现,如下: public Object load(final Class entityClass, final Serializable id ,final boolean isLoadCollections); throws DataAccessException { return execute(new HibernateCallback(); { public Object doInHibernate(Session session); throws HibernateException { Object object= session.load(entityClass, id);; System.out.println("=================BeanUtil load Entity:"+id+" "+"Now initial the "+id+" Entity 's collections-------------------------");; if(isLoadCollections); BeanUtil.loadCollectionsForLazy(object);; return object; } });; } 在BeanUtil中递归循环,只要是集合的元素,就遍历它的每一个元素!这样就可以将你的集合的集合的集合。。所有元素都装载到你的实体所引用的集合里去! |
|
返回顶楼 | |
发表时间:2004-08-03
不用这么麻烦,还是使用spring
用beanwrapper包装一下你的对象: BeanWrapper bean = new BeanWrapperImpl(object); 因为spring的BeanWrapper 可以对付嵌套属性,我们可以这么写: bean.getPrpperty("object.collectionName.collectionName"); spring会利用反射去调用相应的getter. 但这并不解决真正的问题,只是使用上方便一点——只能在对象还在session中使用,而且没有解决我下面提到的问题。 我想问题还是出在OOP处理集合时的语意上。ORM的作用是要我们在开发时按OOP的方式思考。按照这个思路,假如一个父对象与一个子对象是个一对多的关系,那么父对象就应该持有其子对象的所有引用。所以Hiberate在处理父子关系时,在父对象一端要定义一个集合。这样带来的后果的是,加载父对象时,除了会生成一个"select .... from T_parent where id = ?"这样的sql,还会再生成"select .... from T_child where parent_id=?"这样的语句 这在语意上是没问题的,但我前面说的我要控制集合加载数据量上就出问题了:要是表很大的话,而且一个父对象有几个子对象,那么这要加载多少数据?特别是,如果我打算让这个父对象脱离session使用时,我会使用select&update,天,我只是希望更新几个属性,它加载那么多数据干什么? 当出现嵌套的集合时,可能出现的数据冗余加载,那就更多了 如果使用open session in view ,这些问题全部不存在,但如果不使用的话,还真是麻烦多多 |
|
返回顶楼 | |