浏览 7430 次
锁定老帖子 主题:有关如何设计PO的问题
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间: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有什么好处? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-03-07
按照1方式设计:
新建一个Group时,代码里面需要加上这么一句: group.addUsers(new ArrayList(););; 显得好多余。 此外我若根据groupId来load一个Group实例,它是不是会把关联的User全部load到List里面?若该组下的用户很多的话就很恐怖了,并且它load这些User进来对我并没有用处。 按2方式设计: 这些对象之间本来应该存在关联关系都没有了,这是否与面向对象设计不符? |
|
返回顶楼 | |
发表时间:2004-03-07
引用 此外我若根据groupId来load一个Group实例,它是不是会把关联的User全部load到List里面?若该组下的用户很多的话就很恐怖了,并且它load这些User进来对我并没有用处。
看一下懒加载(lazy loading)你就明白了 |
|
返回顶楼 | |
发表时间:2004-03-07
看到了lazy loading的有关内容,不过有关这两种设计方式的问题,你有什么看法么?你是怎么设计的?
|
|
返回顶楼 | |
发表时间:2004-03-08
40的点击,为何只有一个人参与讨论呢?
若是问题太幼稚,你骂一句也好啊,给点回应行不? |
|
返回顶楼 | |
发表时间: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,你要怎么做呢?这样一想就明白对象关联的好处了。 |
|
返回顶楼 | |
发表时间:2004-03-08
我认为要保持他们之间的关联,你所担心的问题如果你设定Group中的one-to-many关联的User是懒加载的话,那就不会在载入Group时自动载入user,但你仍然可以在你需要的时候载入这些user,比如用Hibernate.initilize(group.getUsers());当然前提是要在同一个session内。
|
|
返回顶楼 | |
发表时间:2004-03-08
gigix 写道 加载一个Group的时候,user不会被真实加载上来——如果你需要用到它们,它们就会被加载;否则就不会。方式2也是一种可行的做法,只不过相对不那么方便。假设Group可以嵌套(一个Group里面还有子Group),假设你要从根Group开始取到里面的某个User,你要怎么做呢?这样一想就明白对象关联的好处了。 取得User可以通过userId或userName来获取,如果是要获取某个组下的所有用户也可以通过groupId查询来获取一个User的List啊。 还是没明白这么做的好处哦。 |
|
返回顶楼 | |
发表时间: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(); 这就是好处,明白我的意思吗? |
|
返回顶楼 | |
发表时间:2004-03-10
你的意思是说Group是嵌套的,那么就可以顺着User获取到根Group对吧?推广一下就是假如有多层的这种父子关系,那么可以从在任意层次获取到上层到顶层的父对象。
|
|
返回顶楼 | |