我尝试编写我的第一个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的现有项目,则里程碑将受此项目影响。如果不存在,则不会创建里程碑对象”。我的意思是,如果没有相应的项目,如何告诉构造函数不创建对象?
答案 0 :(得分:1)
答案 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