父子关系表结构:
table department(
id varchar(32),
name varchar(50),
parentid varchar(32)
)
其中id和parentid是主外健关系,表示机构间的父子结构.实体类定义:
@Entity
public class Department implements java.io.Serializable {
private java.lang.String id;
private java.lang.String name;
private java.util.List<Department> childDeps;//下级机构,双向关联子对象
private Department parentDep;//上级机构,双向关联父对象
.......}
在通过持久化层获取department对象时,如果要取得该对象的子对象的某些属性,则需要将childDeps加载类型设置为即时加载(EAGER),但是这样实际上会将整个表中的记录全部载入(如果所有部门只有一个根的话),这样对于机构数量比较多的情况显然不合适。如果加载类型为延时加载(LAZY),在非托管状态下,实体又无法访问子对象的属性。
我现在问题是:
能不能在子对象设置为延时加载的情况下,定义一个@Transient的属性方法,该方法在Department实体实例化时只加载子对象的某些值(可能是计算值,如子对象的数量),不要将子对象整个加载。
我使用的持久化框架是JPA的TopLink实现,我要实现的功能是在应用程序中显示机构的树结构,当树的某个节点N展开时,再去取下级机构。一种方法是给树的每个节点缺省都显示一个+号,在节点展开时去取下级节点数据,如果没有就将节点前的+号去掉,但是这样不能直观的反映节点的真实情况。不知道大家有无更好的办法,这个问题已经困扰几天了,任何意见和提示对我都很重要。

解决方案 »

  1.   

    设置hibernate的抓取策略嘛
    fetch="subselect"
      

  2.   

    利用联结的动态抓取策略,如
    from Item i
    left join fetch i.bids
    where i.description like '%Foo%'
      

  3.   

    非常感谢楼上各位的回复!
    to guodong66:多谢提醒!
    to warison2008:我使用的是TopLink,好像fetch类型只有LAZY和EAGER两种选项;
    to lwl0815:我目前就是采用left join fetch方式,但是这样仍然会将子对象整个载入,我要的效果是只要子对象的某些属性。实际上在我的应用场景中,实体bean需要序列化后传给客户端,这样就脱离了容器成为游离态的普通java对象,不能再使用延时加载的机制,所以在传给客户端之前,我希望将一些重要的属性(比如子对象的某些属性)一起初始化。
      

  4.   

    看看这个帖子,太牛了 
    http://topic.csdn.net/u/20091031/17/0acef9b8-4998-48fa-a302-1959a689b3a0.html