2009-09-02 3 views
0

У меня есть таблица родительских таблиц и отношений, чтобы найти дочерние родительские отношения. Мне нужно найти ребенка, родителя и его братьев и сестер ...Fluent NHibernate/NHibernate Mappings

EMPLOYEE_RELATION имеет столбцы EMPLOYEE_ID и PARENT_ID, которые сохраняют отношения.

Вот что выглядит SQL. Как сопоставить это с Fluent NHibernate/NHibernate.

select 
    V1.PARENT_ID AS PARENT_ID, 
    V.EMPLOYEE_ID AS EMPLOYEE_ID, 
    V2.EMPLOYEE_ID AS SIBLINGS_ID 
FROM 
    EMPLOYEE V 
INNER JOIN EMPLOYEE_RELATION V1 
    ON V.EMPLOYEE_ID = V1.EMPLOYEE_ID 
INNER JOIN EMPLOYEE_RELATION V2 
    ON V2.PARENT_ID = V1.PARENT_ID 
WHERE V.EMPLOYEE_ID = 6357 
+0

Есть причина, у вас есть таблица соотношения вместо того, чтобы иметь родительский идентификатор в таблице сотрудников? Просто установите этот идентификатор равным 0 для сотрудников без родителей. Это облегчило бы поиск корня. – Zoidberg

+0

Это существующие таблицы .. Невозможно изменить их – bkhanal

ответ

0

Отказ от ответственности: Я являюсь пользователем спящего режима Java; Я не использовал NHibernate, но я предполагаю, что это очень похоже.

Некоторые псевдокод: Если у вас есть два объекта сущностей, как:

public class EmployeeRelation { 
Employee Parent //parent property 
Employee Employee //child property 
} 

public class Employee { 
int EmployeeID 
... 
} 

Вы хотите отобразить каждое свойство на EmployeeRelation с помощью отношения многие-к-одному (много EmployeeRelations может указывать на то же самое Наемный рабочий). В hibernate docs подробно описывается информация конфигурации для такого рода отношений.

Затем вы можете сделать (это Java-стиль кода, так что может быть различным для NH):

Criteria c = session.createCriteria(Employee.class); 
c.add(Restrictions.eq("EmployeeID", 6357)); 
Employee myEmployee = (Employee)c.uniqueResult(); 

Затем, чтобы получить братьев и сестер (все отношения для этого родителя):

c = session.CreateCriteria(EmployeeRelation.class); 
c.add(Restrictions.eq("Parent", myEmployee)); 
List<EmployeeRelation> siblings = (List<EmployeeRelation>)c.uniqueResult(); 

Это от верхней части головы; вы можете найти более элегантный способ сделать все это в одном запросе, используя, например, HQL. Если каждый сотрудник может иметь только одного родителя, вы также можете посмотреть на сопоставление Employee с коллекцией других объектов Employee и родительской ссылкой Employee вместо использования объекта EmployeeRelation.

HTH!

2

вы должны иметь возможность создавать график с использованием подхода «многие-ко-многим» с помощью кросс-таблицы EMPLOYEE_RELATION. Другими словами, после того, как вы извлекли какой-либо объект, вы сможете получить все дочерние элементы, прикрепленные к нему, как простой список тех же объектов, что и родительский. И вы должны быть в состоянии пройти дальше, но я не совсем уверен.

Вот как это может выглядеть в файле отображение:

 HasManyToMany(x => x.Employees) 
      .WithTableName("EMPLOYEE_RELATION") 
      .WithParentKeyColumn("PARENT_ID") 
      .WithChildKeyColumn("EMPLOYEE_ID") 
      .Cascade.AllDeleteOrphan() 
      .LazyLoad();