Как реализовать отношения 3-ко-многим с Hibernate? - PullRequest
2 голосов
/ 26 августа 2010

Я не уверен на 100%, что это только проблема Hibernate, поскольку это может быть более абстрактное решение, но я попробую.
Поскольку описание проблемы немного длинное, сначала я скажу, чтото, что я хотел бы сделать, это посмотреть, смогу ли я изменить реализацию на что-то, что больше напоминает реализацию Best Practice, чем это.

У меня есть 3 сущности, относящиеся к этой проблеме: Рабочая станция (ws), Сотрудник иОрганизационная единица (организационная единица).
Сотрудник может принадлежать к одной организационной единице.
Организационная единица может содержать много сотрудников.
Рабочая станция используется для отображения данных организационной единицы (в общем), из организационной единицы и конкретного работника в ней и работника, который не принадлежит организационной единице.

В настоящее время по различным причинам, которые были из моегоуправления, мы не используем никаких связей между сущностями в Hibernate или через DB-Constraints, но мы просто используем столбцы, которые логически служат внешними ключами.
В настоящее время у нас есть дополнительная таблица, которая имеет 4столбцы: Id, WSId, EmployeeId, OrgUnitId.
Это позволяет WS ссылаться на orgunit (где employeeId равен нулю), на сотрудника без org-unit (orgunitId равен null) или на сотрудника и org-unit(где ни один не является нулевым).

Я хотел бы знать:
1.Дать WS, за какими сотрудниками он следует и какие организационные единицы и как (то есть, один, ссотрудник?который?)
2.Дал сотрудника, который WS контролирует его.
3.Дал орг-подразделение, какой WS его контролирует и как (то есть, один, с сотрудником? какой?)
Эта проблема связана со слоем представления, так как он диктует, что представление будет сгенерировано, НО он будет частью модели домена как пользователь, будет использовать интерфейс для управления этими отображениями мониторинга, и поэтому эти отображения являются частью модели домена..

Я не уверен, что то, что у меня есть, не наименее зло среди вариантов, и я был бы очень признателен за комментарии и предложения.

РЕДАКТИРОВАТЬ От одного изОтветы Я думаю, что не совсем понятно, что WS может отображать данные для многих таких сопоставлений одновременно, в смеси указанных выше видов (орг-единица, сотрудник и т. д.)

Ответы [ 2 ]

1 голос
/ 26 августа 2010

ОК, я не знаю, как реализовать это на стороне базы данных, но вот модель сущностей, которая должна охватывать отношения, о которых вы говорите.

Редактировать: Это новая версия в ответ на ваши комментарии.Теперь у каждой рабочей станции есть n привязок, каждая из которых может иметь сотрудника или организацию или оба (используйте ограничения БД, чтобы убедиться, что они не имеют ни одной из них).

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

@Entity
public class OrgUnit{

    @OneToMany(mappedBy="orgUnit")
    private Set<Binding> bindings;

}

@Entity
public class Employee{

    @OneToMany(mappedBy="employee")
    private Set<Binding> bindings;

}

@Entity
public class Binding{

    @ManyToOne(optional = true)
    private Employee employee;

    @ManyToOne(optional=true)
    private OrgUnit orgUnit;

    @ManyToOne(optional=false)
    private WorkStation owner;

}

@Entity
public class WorkStation{

    @OneToMany(mappedBy="owner")
    private Set<Binding> bindings;

}

Пример кода клиента:

public Set<WorkStation> getWorkstationsPerEmployee(final Employee employee){
    final Set<WorkStation> workStations = new HashSet<WorkStation>();
    for(final Binding binding : employee.getBindings()){
        WorkStation workStation = binding.getOwner();
        if(workStation!=null)
            workStations.add(workStation);
    }
    return workStations;
}
0 голосов
/ 26 августа 2010

Похоже, все, что вам действительно нужно, это обнуляемый FK для Employee to OrgUnit и два обнуляемых FK на WS как Employee и OrgUnit. Чтобы увидеть, какой WS отслеживает сотрудника, просто получите все WS с соответствующими столбцами emp_id. То же самое с WS-мониторингом OrgUnit, возможно, с дополнительным условием emp_id, равным нулю или нет (в зависимости от того, нужно ли вам обрабатывать эти ситуации отдельно). Понятия не имею, куда вписываются «пациенты», вы не сообщили об этом никаких подробностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...