Вставка дочерних объектов в MyBatis - PullRequest
2 голосов
/ 25 января 2011

У меня есть очень простой объектный граф, который я хочу сохранить в базе данных, используя MyBatis. Если я создаю новый граф объектов (BatisNode с двумя деталями), как мне написать код, чтобы убедиться, что дочерние объекты созданы? Вот подробности:


public class BatisNode {
    protected int id;
    protected List details;
    protected String name;
        //Constructor and getters.
}

public class BatisNodeDetail {
    protected int id;
    protected BatisNode parent;
    protected String name;
        //Constructor and getters.
}

Схема:

CREATE TABLE node (
    node_id int auto_increment primary key,
    name varchar(255)
);

CREATE TABLE node_detail(
    node_detail_id int auto_increment primary key,
    name varchar(255)
);

Mapper:

    
        
INSERT INTO node (
  name
)
SELECT #{name};
        

        
SELECT node_id id,
name
FROM node
WHERE node_id=#{id};
        

        
        


1 Ответ

4 голосов
/ 25 января 2011

Ibatis / Mybatis - это не ORM, а просто DataMapper, и эта простота / ограничения особенно четко проявляются в этих сценариях (графе объектов): он (в основном) не знает о графе объектов.

Один из подходов, который я выбрал, заключается в следующем:

У меня есть:

  1. слой легких объектов POJO («объектов DTO»), каждый из которых соответствует таблице базы данных (один объект <-> одна запись таблицы базы данных), они имеют немного больше свойств (как ваши примеры BatisNode и BatisNodeDetail)

  2. уровень DAO, один объект службы для каждого DTO (скажем, BatisNodeDAO и BatisNodeDetailDAO) со вставленным источником данных и стандартными методами insert / loadById / delete и select ( iBator может помочь вам в этом)

  3. уровень обслуживанияПомимо наличия типичных классов обслуживания (обычно синглетонов), он также определяет некоторые тяжеловесные объекты («доменные объекты»), с которыми они имеют дело и которые обычно соответствуют графу объектов DTO (в yнаш пример, BatisNodeWithDetails).Эти доменные объекты знают, как загрузить / сохранить граф обернутых DTO, вызывая DAO (и заботясь о транзакциях, обнаружении «грязных» объектов и т. Д.).Обратите внимание, что может быть несколько «классов доменов», которые заключают в себе один и тот же DTO (то есть разные графы) для разных методов обслуживания или вариантов использования.

...