2016-03-29 11 views
0

私は最初のDAOプログラムを作成しようとしています。 私のデータベースでは、PROJECTとMILESTONEという2つのテーブルを作成しました。通常、私はプロジェクトとマイルストーンとの間に集約関係を持っています。プロジェクトは多くのマイルストーンを持つことができますが、マイルストーンは必然的に1つのプロジェクトのみに影響されます。JAVA(DAO)とSQLにおける集約関係

私は2つの主要な質問があります。

1)SQLテーブルでは、それは私がPROJECTIDに制約(外部キー)を追加しなければならなかったことを意味し、マイルストーンテーブルへの外部キーを関連付けるのでしょうか? これまで、私はマイルストーンテーブルに "projectid"という名前の列を持つことを選択しました。私の意見では、それをすれば簡単です。

2)私はマイルストーンオブジェクトを作成すると、それはPROJECTIDをspecifiyするコンパルソリーですので、私はこのコンストラクタを書き込もうとしました:

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?? 
    } 
    } 

ここproblemeは、私は、この条件を翻訳することができますかわかりませんさJavaで: "この指定されたIDを持つ既存のプロジェクトがある場合、マイルストーンはこのプロジェクトに影響を与えます。そうでなければ、マイルストーンオブジェクトは作成されません"。対応するプロジェクトがない場合、オブジェクトを作成しないようにコンストラクタにどのように伝えることができますか?

答えて

1
  1. コンストラクターは値を返すことができません。ヌル値を返す代わりに例外(例:IllegalArgumentException)をスローすることができます。
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、あなたべきAutowire DAOクラスIFのようなIDの使用整数データ型を作る...例外を与えることができますDaoクラスはクラス全体で何度も呼び出さなければなりません。

最初の質問については、あなたのデータベーステーブルは、おそらくあなたが言及したシナリオのように見えるはずです。

Project 

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

Milestone 

milestoneId (PK), 
projectId (FK), 
// ...other fields 
関連する問題