2009-02-04 16 views
5

Digamos que tengo esta clase:¿Cómo implementar relaciones de uno a muchos en Ibatis?


    Class A { 
     int id; 
     int[] b; 
     // Other properties 
    } 

    Class B { 
     int id; 
     // Other properties 
    } 

La Clase A tiene uno-a-muchos relación con la clase B. Ya tengo un servicio que almacena en caché los objetos B y devolverlos en ID.

Esquema de tabla es como la siguiente


    Table a: 
    ------- 
     int id, 
     prop1, 
     etc 

    Table a_to_b_map 
    ---------------- 
     int a_id, 
     int b_id 

Ahora, ¿cómo este mapa en iBatis?

Dado que los objetos B ya están en la memoria caché, quiero obtener la lista de identificadores en los objetos A y luego usar el servicio para enriquecer As.

¿Alguien puede sugerir cómo hacerlo?

dos posibles alternativas que se me ocurre son:

  1. Crear una clase interna en A (mapa AtoB) y utilizar una consulta de selección en iBatis config para poblar este
  2. Dentro del/Selección de iBatis resultMap otro seleccione para obtener la lista de B id (no estoy seguro de cómo hacer esto en la configuración)

Respuesta

0

No estoy seguro de haber entendido bien su pregunta.

Suponiendo que hará una consulta basada en la identificación de A, ¿qué le parece escribir una consulta en ibatis que se una a las dos tablas?

select * 
from a, a_to_b_map 
where a.id = #id# and a.id = a_to_b_map.a_id 

continuación, puede utilizar un 'queryForMap' para devolver un HashMap de A_ID vs (colección de registros de la consulta). Utilizar un método personalizado para convertir esta estructura de datos en un objeto de 'A'

+0

Que ks Rahul. Pero el problema con este enfoque sería: "Demasiados objetos" y terminaríamos haciendo group_by (similar) en el código. – Jagmal

1

en mybatis 3 es un poco diferente. Puede hacerlo especificando dos declaraciones de selección o puede usar join y luego crear resultMap con etiqueta de colección.

<resultMap id=”blogResult” type=”Blog”> 
    <collection property="posts" javaType=”ArrayList” column="blog_id" 
     ofType="Post" select=”selectPostsForBlog”/> 
</resultMap> 

<select id=”selectBlog” parameterType=”int” resultMap=”blogResult”> 
    SELECT * FROM BLOG WHERE ID = #{id} 
    </select> 
<select id=”selectPostsForBlog” parameterType=”int” resultType="Author"> 
    SELECT * FROM POST WHERE BLOG_ID = #{id} 
    </select> 

o puede utilizar unirse a

<select id="selectBlog" parameterType="int" resultMap="blogResult"> 
select 
    B.id as blog_id, 
    B.title as blog_title, 
    B.author_id as blog_author_id, 
    P.id as post_id, 
    P.subject as post_subject, 
    P.body as post_body, 
from Blog B 
    left outer join Post P on B.id = P.blog_id 
where B.id = #{id} 
</select> 

y hacer un mapa resultado

<resultMap id="blogResult" type="Blog"> 
    <id property=”id” column="blog_id" /> 
    <result property="title" column="blog_title"/> 
    <collection property="posts" ofType="Post"> 
    <id property="id" column="post_id"/> 
    <result property="subject" column="post_subject"/> 
    <result property="body" column="post_body"/> 
    </collection> 
</resultMap> 

puede obtener totorial completa de la guía de usuario ibatis aquí:

http://svn.apache.org/repos/asf/ibatis/java/ibatis-3/trunk/doc/en/iBATIS-3-User-Guide.pdf

Cuestiones relacionadas