论坛首页 Java企业应用论坛

多级一对多的对象的设计问题?

浏览 6206 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-09-21  
现实情况:一个项目按照以下级别来划分,项目 -》区域 -》单元 -》专业 ,共分四级,每一级的关系都为一对多,即,一个项目由多个区域组成,一个区域由多个单元组成,一个单元可以划分为多个专业来完成。
如何将这种现实的情况使用对象来描述出,最初想法,使用一对多,但是当我希望获得一个项目中所有的单元或得到所有的专业列表时,就出现问题,很麻烦。
于是我就想在区域、单元、专业中增加所有上级的多对一关系,感觉问题解决了,但是总感觉这种办法很笨,
也打算使用组合关键字的方法减少对象的数量,但好像又不是OOP,请各位高手指点,不知各位是否遇见这种多级一对多的情况,是如何处理的。
谢谢!!
   发表时间:2003-09-22  
不知道你说的多对一是不是指双向关系。

我认为如下:

项目 -》区域 -》单元 -》专业是三个一对多的关系,其实也可以有项目 -》单元一对多的关系,项目 -》专业的一对多关系,这样在单元的表中会有项目的外键,专业的表中也会有项目的外键。

在存入区域 -》单元的关系时, 同时把项目 -》单元的关系也存入。这样取的时候就可以象你所说的取了。

好象也比较麻烦。不知道直接用HQL子查询行不行? 欢迎讨论。
0 请登录后投票
   发表时间:2003-09-22  
对bruce:
多对一是双向的关系,我非常同意“在存入区域 -》单元的关系时, 同时把项目 -》单元的关系也存入。这样取的时候就可以象你所说的取了。 ”将这些关系能够不让调用的人知道,自动建立。我试了多对一关系,它是在对象类中增加了父对象,在数据表中增加了父对象的ID,对于专业这样的对象来说增加了三个父对象,性能上估计很差。
我打算使用这种方案:
在每一个子类中,增加父类的ID,但不建立多对一关系,(主要是不想建立父类的对象),使用bruce的建议,这些父类的ID由父类的方法在增加子类时自动添加,数据库的结构和增加多对一关系一样。这种做法类似于最早关系型数据库解决树型结构的方法。
欢迎大家多多讨论。
0 请登录后投票
   发表时间:2003-09-22  
mmt 写道
对bruce:
多对一是双向的关系,我非常同意“在存入区域 -》单元的关系时, 同时把项目 -》单元的关系也存入。这样取的时候就可以象你所说的取了。 ”将这些关系能够不让调用的人知道,自动建立。我试了多对一关系,它是在对象类中增加了父对象,在数据表中增加了父对象的ID,对于专业这样的对象来说增加了三个父对象,性能上估计很差。
我打算使用这种方案:
在每一个子类中,增加父类的ID,但不建立多对一关系,(主要是不想建立父类的对象),使用bruce的建议,这些父类的ID由父类的方法在增加子类时自动添加,数据库的结构和增加多对一关系一样。这种做法类似于最早关系型数据库解决树型结构的方法。
欢迎大家多多讨论。


我感觉你这样的做法还是不是纯OO的应用。其实这应该是对象关系的实现问题。但是你这里却总是想到表的结构。要考虑在哪个哪个表放置什么外键的问题。这还是传统的面向数据的编程思路。项目->区域->单元之间的这种关系。在对象设计的时候可以有两种表示法:

1、链状双向关系结构:一个项目包含多个区域,一个区域包含多个单元;对应到设计的类图就是区域到项目有一条关系线,单元到区域有一条关系线。
表现到代码上就是:
//project.java

public class project
{
    private String projectid;
    ...
    private Set theAreas;
    ...
}

//area.java
public class area
{
    ...
    private project theProject;
    private Set theParts;
    ...
}

//part.java
public class part
{
    ...
    private area theArea;
    ...
}


下面接着说:
0 请登录后投票
   发表时间:2003-09-22  
2、环状关系结构:一个项目包含多个区域,一个区域包含多个单元,一个区域包含多个项目;对应到设计的类图就是在链状双向关系结构里多了单元到项目之间的一条关系线。
对应的代码为:

//project.java

public class project
{
    private String projectid;
    ...
    private Set theAreas;
    private Set theParts;
    ...
}

//area.java
public class area
{
    ...
    private project theProject;
    private Set theParts;
    ...
}

//part.java
public class part
{
    ...
    private area theArea;
    private project theProject;
    ...
}


选择不同的对象结构,当然就对应不同的代码实现。自然根据同样的ORM原则就可以实现不同的表结构关系了。

多讨论!
0 请登录后投票
   发表时间:2003-09-22  
试试子查询吧。

示意的HQL如下(注:下面的代码不是已经真正运行的HQL,还需要修改)

select b.c from B as b where b.bId in (select a.bId from A as a where a.aId is not null);


a-b    one2many
b-c     one2many
0 请登录后投票
论坛首页 Java企业应用版

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