JAVA(DAO)和SQL中的聚合关系

时间:2016-03-29 10:26:16

标签: java sql dao aggregation

我尝试编写我的第一个DAO程序。 在我的数据库中,我创建了两个表:PROJECT和MILESTONE。通常,我在项目和里程碑之间存在聚合关系:项目可以有许多里程碑,但里程碑不可避免地只受到一个项目的影响。

我有两个主要问题:

1)在SQL表中,是否意味着我必须在projectid上添加约束(外键)并将该外键与里程碑表相关联? 到目前为止,我选择在里程碑表中有一个名为“projectid”的列。在我看来,如果我们这样做就很简单。

2)当我创建一个里程碑对象时,指定projectid是强制性的,所以我试着编写这个构造函数:

 public Milestone (String name, String description, String projectId) throws SQLException, ClassNotFoundException {
    this.name = name;
    this.description = description;

    ProjectDAOImpl proj = new ProjectDAOImpl();
    // "proj.findById(projectId)" is to verify if a real project exist having the specified id 
    if ( (proj.findById(projectId))!= null )  {
        this.projectId = projectId;
    }
    else {
        return null; //is it correct to do that in a constructor??
    }
    }

这里的问题是我不知道如何在Java中翻译这个条件: “如果存在具有此指定ID的现有项目,则里程碑将受此项目影响。如果不存在,则不会创建里程碑对象”。我的意思是,如果没有相应的项目,如何告诉构造函数不创建对象?

2 个答案:

答案 0 :(得分:1)

  1. 构造函数无法返回值。您可以抛出异常(例如,IllegalArgumentException)而不是返回空值。

答案 1 :(得分:0)

首先,构造函数不能返回任何内容。另外,您可以提供异常......可能是构造函数中的有效异常

尝试此链接并相应地进行更改 Is it good practice to make the constructor throw an exception?

@AutoWired
ProjectDAOImpl proj;

public Milestone (String name, String description, Integer projectId){
 this.name = name;
 this.description = description;
 if ( (proj.findById(projectId))!= null ) throws NullPointException
}

对于像projectId这样的ids使用Integer数据类型,如果必须在整个班级中多次调用Dao类,你应该自动挂载Dao类。

关于第一个问题,我认为您的数据库表对于您提到的场景应该看起来像这样。

Project

projectId (PK),
// ...other fields

Milestone

milestoneId (PK),
projectId (FK),
// ...other fields