2016-03-29 4 views
0

Я пытаюсь написать свою первую программу DAO. В моей базе данных я создал две таблицы: PROJECT и MILESTONE. Обычно у меня есть агрегирующая взаимосвязь между проектом и этапом: проект может иметь много этапов, но веха неизбежно затрагивает только ОДИН проект.Соотношение агрегирования в JAVA (DAO) и SQL

У меня есть два основных вопроса:

1) В таблицах SQL, это значит, что я должен был добавить Ограничить (иностранный ключ) на ProjectID и связаны, что внешний ключ к таблице вех? До сих пор я выбрал столбец с именем «projectid» в таблице веха. На мой взгляд, это просто, если мы это сделаем.

2) Когда я создаю объект веха, это ОБЯЗАТЕЛЬНО к specifiy в 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?? 
    } 
    } 

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 
} 

Используйте Integer тип данных для идентификаторов как ProjectID и вы должны классы Autowire Dao IF класс Dao следует называть много раз по всему классу.

И что касается первого вопроса, я думаю, что ваши таблицы таблиц данных должны, вероятно, выглядеть так для упомянутого вами сценария.

Project 

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

Milestone 

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