2012-04-26 2 views
2

У меня проблема с соединением таблицы. На самом деле я действительно потерял, как это сделать. У меня есть сопоставление таблицы Hibernate.Hibernate: Как мне присоединиться к таблице с собой?

<class name="Technology" table="TECHNOLOGIES"> 
    <id name="technoId"> 
     <column name="techno_id" /> 
     <generator class="identity" /> 
    </id>   
    <property name="description" type="java.lang.String"> 
     <column name="description" /> 
    </property> 
    <many-to-one name="parent" class="Technology" /> 
</class> 

Родитель столбца связан с одной и той же таблицей. Пример таблицы, чтобы вы могли понять меня.

techno_id | описание | Родитель

1 ------------ "Java" ---------- нуль

2 ------------» Hibernate "------ 1

3 ------------" HQL "------------ 2

4 --- --------- ". NET" ---------- null

5 ------------ "NHibernate" ---- 4

Это в основном пример таблицы, у нее нет реальных данных, это всего лишь пример. Что я хочу сделать, в методе, который получает techno_id, работает с критериями или HQL, и это приносит мне список результатов с идентификаторами детей. Например, если я отправил методу «1» techno_id, он должен принести мне список с идентификаторами «1, 2, 3». Надеюсь, я был предельно ясен, и вы можете мне помочь. Спасибо, и извините за мою английскую джаю.

ответ

0

Вы должны использовать присоединиться тег с обратной

<join table ="Technologies" inverse ="true" optional = "false"> 
    <key column = "techno_id"/> 
    <many-to-one name="parent" class="Technology" /> 
</join> 
+0

Спасибо, но как я делаю метод? Мне нужно сделать метод, который получит techno_id и посмотрит его на все техно_иды, которые являются его дочерьми, а также дети из них. – user1359159

+0

Или как я делаю запрос или ограничения критериев? – user1359159

+0

Ну, у вас есть «технология» pojo, в которой вы определяете объект «Технология родителя». Тогда просто hql например: «от технологии tech, где tech.parent =: techno ", где техно можно было бы установить на другую' Технология' obj –

0

Есть два способа сделать это.

  1. По критериям:

    1. For specific level fetching : e.g 3 level fetching(As per your example) 
    public Technology getAllChildrenTechnology(long parentID){ 
    Crtieria criteria = session.createCriteria(Technology.class); 
    criteria.add(Restriction.eq("id",parentID)); 
    criteria.setFetchMode("parent",FetchMode.JOIN); 
    criteria.setFetchMode("parent.parent",FetchMode.JOIN); 
    criteria.setResultTransformer(criteria.DISTINCT_ROOT_PROPERTY); 
    Technology techno = (Technology)criteria.uniqueResult(); 
    return techno; 
    } 
    
    2. For N level Fetching : You need to create n level for loop.(Recursive loop using above). 
    
  2. ленивый:

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

    <many-to-one name="parent" class="Technology" lazy="false"/> 
    
+0

Но проблема в том, что этот метод приносит мне только одну технологию, мне нужно (не зная, сколько уровней у меня будет детей) метод, который я отправляю ему Techno_id, и метод возвращает мне сборник технологий, которые являются детьми этой Технологии, а также приносит мне всех детей детей и т. д. – user1359159

+0

В этом случае вам нужно использовать N Level Fecthing, как я уже сказал. – PVR

0

Я считаю, что этот вопрос не очень Hibernate специфичны. Даже вы пишете SQL, у вас нет простого способа получить узел со всем его потомком, без специальной обработки в дизайне.

Самый простой способ состоит в том, чтобы каждая технология содержит список детских технологий (двунаправленная связь). Затем рекурсивно переходите к технологиям детей.

Если вам нужен быстрый поиск из хранилища постоянного хранения, вы должны удовлетворить это в своем дизайне. Один из способов описан в ответе, который я написал ранее для аналогичного вопроса. https://stackoverflow.com/a/7524077/395202 Этот метод не тот, что Hibernate приветствуется в любом случае (он по-прежнему работает, просто нужно дополнительное внимание)

Смежные вопросы