2016-06-05 4 views
0

Как я могу сделать объект DAO собственностью другого DAO?Выполнение DAO: создание объекта DAO в качестве имущества другого DAO

Скажем, у меня есть объект Employee с имуществом Департамента

public class Employee { 
    public Department; 

     //setter and getters 
    } 

Я имел этот интерфейс EmployeeDAO и DepartmentDAO с соответствующими реализациями

И я был DAOFactory

public abstract class DAOFactory { 

// db connection instantiation here 

public IEmployeeDAO getEmployeeDAO() { 
    return new EmployeeDAOImpl(this); 
} 

public IDepartmentDAO getDepartmentDAO() { 
    return new DepartmentDAOImpl(this); 
} 

}

У меня был сервлет, где экземпляр этого DAOfa ctory

public class EmployeeController extends HttpServlet { 

public EmployeeController() { 
    super(); 
    DBUtils dbInstance = DBUtils.getInstance("mysql"); 
    System.out.println("DAOFactory successfully obtained: " + dbInstance); 

    // Obtain UserDAO. 
    employeeDAO = dbInstance.getEmployeeDAO(); 
    departmentDAO = dbInstance.getDepartmentDAO(); 
    jobDAO = dbInstance.getJobDAO(); 

} 
protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

      employees = employeeDAO.findAll(); 

      request.setAttribute("employees", employees); 

} 

мой вопрос, как я могу отобразить объект отдела внутри employeeDAO или его реализации, когда я вызываю метод FindAll в employeeDAO?

У меня было что-то подобное в моей попытке картировать результаты:

private Employee map(ResultSet rs) throws SQLException { 
    Employee employee = new Employee(); 

    employee.setEmployeeID(rs.getInt("EMPLOYEE_ID")); 
    employee.setFirstName(rs.getString("FIRST_NAME")); 
    employee.setLastName(rs.getString("LAST_NAME")); 

    Department department = new DepartmentDAOImpl().getDepartmentByID(rs 
      .getInt("DEPARTMENT_ID")); 

    employee.setDepartment(department); 

    return employee; 
} 

Но я думаю, что это неправильный подход. Может кто-то помочь мне с этим?

+0

Почему это должно быть неправильным подход? Не работает ли работа так, как ожидалось? (Хотя я бы рассмотрел использование JPA вместо ручного сопоставления объектов, потому что он делает все dao для вас. И хотя у него есть абстракция более высокого уровня, чем расширение HttpServlets) – zapl

+0

Потому что я непосредственно создаю экземпляр реализации DAO, который должен быть скрытым/или затененным интерфейсом DAO. Я стремился сделать это возможным, как только я вызову employeeDAO.findAll(); Я видел некоторые статьи о JPA тоже. Я планирую реализовать его в своих будущих проектах. –

ответ

0

У вас EmployeeDAOImpl есть зависимость от IDepartmentDAO. Вместо прямого создания экземпляра, объявите его как зависимость и пусть код, который создает EmployeeDAOImpl, выясняет, как его решить.

Предполагая

interface IEmployeeDAO { 
    Employee load(long id); 
} 
interface IDepartmentDAO { 
    Department load(long id); 
} 

как интерфейсы требуют необходимой дао в конструкторе

class EmployeeDAOImpl implements IEmployeeDAO { 

    private final DAOFactory factory; 
    private final IDepartmentDAO departmentDAO; 

    public EmployeeDAOImpl(DAOFactory factory, IDepartmentDAO departmentDAO) { 
     this.factory = factory; 
     this.departmentDAO = departmentDAO; 
    } 
    ... 

и теперь вы можете использовать его в любом месте. например

@Override 
public Employee load(long id) { 
    ... 
    long departmentId = .... 
    Department department = departmentDAO.load(departmentId); 
    employee.department = department; 
    return employee; 
} 

Ваш DAOFactory который знает, какой вид реализаций используется в любом случае теперь может предоставить зависимости от добавления простого параметра

public IEmployeeDAO getEmployeeDAO() { 
    return new EmployeeDAOImpl(this, getDepartmentDAO()); 
} 
+0

Спасибо, что помогли мне сэр. –

+0

О, еще один вопрос, как я могу создать экземпляр DAO отдела, если у меня есть объект-менеджер, который расширяет класс сотрудника как его свойство? –

+0

@GmChill То же самое возможно (сделайте это аргументом конструктора). Но я также не уверен, как вы это понимаете. Яйцо обычно не должно «распространять» то, что оно управляет, ему просто нужна ссылка на вещь: [«Что такое принцип замещения Лискова?»] (Http: // stackoverflow.com/questions/56860/what-is-the-liskov-substitution-princip) – zapl