论坛首页 Java企业应用论坛

有关如何设计PO的问题

浏览 7430 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-03-06  
组和用户的关系,直接贴代码算了,一看就明白意思。

1.按Hibernate文档所说,应该这么写代码:
public class Group {
    public int getGroupId(); {
        return groupId;
    }

    public void setGroupId(int groupId); {
        this.groupId = groupId;
    }

    public List getUsers(); {
        return users;
    }

    public void setUsers(List users); {
        this.users = users;
    }

    private int groupId;
    private List users;
}


public class User {
    public long getUserId(); {
        return userId;
    }

    public void setUserId(long userId); {
        this.userId = userId;
    }

    public Group getGroup(); {
        return group;
    }

    public void setGroup(Group group); {
        this.group = group;
    }


    private long userId;
    private Group group;
}


2.按原来的思维方式,我这么写:
public class Group {
    public int getGroupId(); {
        return groupId;
    }

    public void setGroupId(int groupId); {
        this.groupId = groupId;
    }

    private int groupId;
}

public class User {
    public long getUserId(); {
        return userId;
    }

    public void setUserId(long userId); {
        this.userId = userId;
    }

    public int getGroupID(); {
        return groupId;
    }

    public void setGroupId(int groupId); {
        this.groupId = groupId;
    }


    private long userId;
    private int groupId;
}


按2的方式完全映射数据库字段,这样做也可以做到所需要的功能。不明白Hibernate通过1方式来设计PO有什么好处?
   发表时间:2004-03-07  
按照1方式设计:
新建一个Group时,代码里面需要加上这么一句:
group.addUsers(new ArrayList(););;

显得好多余。
此外我若根据groupId来load一个Group实例,它是不是会把关联的User全部load到List里面?若该组下的用户很多的话就很恐怖了,并且它load这些User进来对我并没有用处。

按2方式设计:
这些对象之间本来应该存在关联关系都没有了,这是否与面向对象设计不符?
0 请登录后投票
   发表时间:2004-03-07  
引用
此外我若根据groupId来load一个Group实例,它是不是会把关联的User全部load到List里面?若该组下的用户很多的话就很恐怖了,并且它load这些User进来对我并没有用处。


看一下懒加载(lazy loading)你就明白了
0 请登录后投票
   发表时间:2004-03-07  
看到了lazy loading的有关内容,不过有关这两种设计方式的问题,你有什么看法么?你是怎么设计的?
0 请登录后投票
   发表时间:2004-03-08  
40的点击,为何只有一个人参与讨论呢?
若是问题太幼稚,你骂一句也好啊,给点回应行不?
0 请登录后投票
   发表时间:2004-03-08  
jeffrey_he 写道
按照1方式设计:
新建一个Group时,代码里面需要加上这么一句:
group.addUsers(new ArrayList(););;

显得好多余。
此外我若根据groupId来load一个Group实例,它是不是会把关联的User全部load到List里面?若该组下的用户很多的话就很恐怖了,并且它load这些User进来对我并没有用处。

按2方式设计:
这些对象之间本来应该存在关联关系都没有了,这是否与面向对象设计不符?


新建Group时,我通常会在Group的ctor里面把_users的list创建好,client(多半是DAO)只要调用group.addUser(user)就可以了。addUser方法大概是这样:
// Group.addUser
_users.add(user);
user.setGroup(this);

加载一个Group的时候,user不会被真实加载上来——如果你需要用到它们,它们就会被加载;否则就不会。方式2也是一种可行的做法,只不过相对不那么方便。假设Group可以嵌套(一个Group里面还有子Group),假设你要从根Group开始取到里面的某个User,你要怎么做呢?这样一想就明白对象关联的好处了。
0 请登录后投票
   发表时间:2004-03-08  
我认为要保持他们之间的关联,你所担心的问题如果你设定Group中的one-to-many关联的User是懒加载的话,那就不会在载入Group时自动载入user,但你仍然可以在你需要的时候载入这些user,比如用Hibernate.initilize(group.getUsers());当然前提是要在同一个session内。
0 请登录后投票
   发表时间:2004-03-08  
gigix 写道

加载一个Group的时候,user不会被真实加载上来——如果你需要用到它们,它们就会被加载;否则就不会。方式2也是一种可行的做法,只不过相对不那么方便。假设Group可以嵌套(一个Group里面还有子Group),假设你要从根Group开始取到里面的某个User,你要怎么做呢?这样一想就明白对象关联的好处了。


取得User可以通过userId或userName来获取,如果是要获取某个组下的所有用户也可以通过groupId查询来获取一个User的List啊。

还是没明白这么做的好处哦。
0 请登录后投票
   发表时间:2004-03-09  
jeffrey_he 写道
gigix 写道

加载一个Group的时候,user不会被真实加载上来——如果你需要用到它们,它们就会被加载;否则就不会。方式2也是一种可行的做法,只不过相对不那么方便。假设Group可以嵌套(一个Group里面还有子Group),假设你要从根Group开始取到里面的某个User,你要怎么做呢?这样一想就明白对象关联的好处了。


取得User可以通过userId或userName来获取,如果是要获取某个组下的所有用户也可以通过groupId查询来获取一个User的List啊。

还是没明白这么做的好处哦。


Group aGroup = aUser.getParent().getParent().getParent();

这就是好处,明白我的意思吗?
0 请登录后投票
   发表时间:2004-03-10  
你的意思是说Group是嵌套的,那么就可以顺着User获取到根Group对吧?推广一下就是假如有多层的这种父子关系,那么可以从在任意层次获取到上层到顶层的父对象。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics