Я разрабатываю пример Java-приложения, использующего встроенную схему Oracle «HR». Я хотел бы рассматривать строки таблицы как объекты Java. Одна из таблиц в схеме управления персоналом, СОТРУДНИКИ, ссылается на себя. У него есть столбец MANAGER_ID, который содержит (если не NULL) внешний ключ для другой строки в таблице EMPLOYEES.
В объектно-ориентированных терминах проблема заключается в том, как получить доступ к данному менеджеру объекта Employee (который является другим объектом Employee). Стремительная загрузка не кажется хорошим решением, поскольку у данного менеджера объекта Employee также может быть менеджер и так далее. Количество объектов, которые охотно загружаются в этой ситуации, не ограничено.
Пока я решил загружать поле MANAGER_ID при создании объекта Employee. Затем, когда запрашивается объект Employee для менеджера сотрудника (с помощью метода getManager()
), последний будет загружен лениво. В коде:
public class Employee
{
private int id;
private int managerId;
private Employee manager;
public int getId()
{
return id;
}
public Employee getManager()
{
if(manager == null && managerId > 0)
{
// Lazy loading!
}
return manager;
}
public void setManager(Employee manager)
{
this.manager = manager;
this.managerId = manager.getId();
}
}
Так это хороший подход? Единственная проблема, которую я имею с этим, состоит в том, как осуществить ленивую загрузку. Казалось бы, объект Employee нуждается в ссылке на его экземпляр - предположительно, это было бы то же самое, что и экземпляр его объекта Employee.
Кроме того, я знаю, что мог бы просто использовать одну из многих платформ ORM, вместо того, чтобы развернуть свою собственную, но я делаю это самостоятельно, чтобы лучше понять базовый процесс (ы).
РЕДАКТИРОВАТЬ: Просто чтобы прояснить, моя архитектура для этого усилия (как он есть) вообще не включает Java EE. Это архитектура Java SE, где клиент взаимодействует с сервером через простой RMI.
Кроме того, приведенному выше классу Employee явно требуется ссылка на DAO для выполнения отложенной загрузки. Тем не менее, я не считаю это тесно связанным, потому что:
- объект Employee может содержать ссылку на абстрактный интерфейс, который реализует DAO; и / или
- объект Employee может содержать ссылку на объект сервера, который, в свою очередь, содержит (частную) ссылку на DAO.
Обратите внимание, что в случае # 2 объект сервера, на который ссылается объект Employee, предположительно тот же, на который ссылается клиент.