Картографиране на дърво с MyBatis?

Опитвам се да си проправя път през създаването на дървовидна структура и нейното картографиране с MyBatis. Моята маса е дефинирана като;

CREATE TABLE `Hierarchy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parentId` int(11) NULL DEFAULT NULL,
  `name` varchar(45) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Опитах се да направя асоциация в MyBatis с;

@Select(SELECT_ALL)
    @Results(value = {
            @Result(property = "id", column = "id"),
            @Result(property = "children", column = "parentId",
                    jdbcType = JdbcType.NUMERIC,
                    many = @Many(select = "selectById")),
            @Result(property = "name", column = "name")
    })
    List<Hierarchy> selectAll();

Моят клас има;

private Integer id;
private Integer parentId;
private String name;
private List<Hierarchy> children;

Доста бързо разбрах, че това няма да работи, тъй като ще завърши с асоцииране назад и връщам деца многократно в набора от резултати. И така, какъв е отговорът? Трябва ли да повтарям, след като направя избора и попълвам децата си по този начин?

Опитах няколко подхода към това, но всички те изглеждат ужасно неефективни и ми е трудно да се справя с препратки към родителски идентификатори, без да повтарям списъка два пъти.

И така, някой правил ли е това преди? Каква е уловката?


person Random Coder    schedule 15.02.2015    source източник


Отговори (1)


Направих това преди няколко години с iBatis и никога не бях доволен от резултата. Моето дърво беше само за четене, което опрости кода. Също така трябваше да навигирам дървото нагоре и надолу, така че всеки запис имаше указател на родителски клас. Алгоритъмът (използвайки имената на вашите класове и т.н.) беше:

  1. Прочетете цялата таблица на базата данни в списък. Това просто използва "избор * от йерархия" и стандартно картографиране на резултата.
  2. Преминете през списъка, образувайки индекс (Map) на първичните ключове и отбелязвайки коренния елемент, който трябва да бъде единственият запис с нулев parentId.
  3. Преминете през списъка втори път, като търсите родителския запис на всеки елемент от Картата и извиквате this.setParent(Hierarchy parent) и parent.addChild(Hierarchy child)

Всичко това работи добре, но далеч не е елегантно. Както отбелязахте, има нужда от две преминавания през списъка. Ако намерите по-добър метод, моля, споделете го.

person kiwiron    schedule 15.02.2015
comment
Ще се използва ли самостоятелно присъединяване тук? - person Shailesh Pratapwar; 14.05.2015
comment
@Shinchan Опитах това и самостоятелното присъединяване е опция за извличане на данните, ако знаете максималната дълбочина на дървото. Но нямам идея как да подредя файловете за картографиране на iBatis/myBatis, за да създам правилно свързано дърво. някакви мисли? - person kiwiron; 15.05.2015