2011-01-25 7 views
2

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

 

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}; 
     

     
     


ответ

4

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

Один подход я принял это:

у меня есть:

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

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

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

+0

Спасибо за совет. Это мой первый проект батиса. Это звучит как довольно много работы для двух объектов. У меня больше в реальной жизни. Будет ли спящий режим лучшим выбором здесь? – User1

+2

Невозможно выбрать между Hibernate и iBatis только с этой информацией. Количество объектов здесь неважно (на самом деле мой подход платит больше, если есть много объектов). Более уместна сложность графиков объектов, которые обрабатываются в ваших методах обслуживания, необходимость обнаружения «грязных» дочерних объектов и т. Д. IBatis более легкий/простой/низкий уровень, чем Hibernate/JPA, и это всегда имеет преимущества (легче понять и проявить себя, меньше сюрпризов или грязных ошибок) и недостатки (требуется больше сантехники, меньше мощности и возможностей, трудно реализуемых для сложных случаев использования) – leonbloy

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

  • Нет связанных вопросов^_^