2009-02-04 29 views
5

Hãy nói rằng tôi có lớp này:Làm cách nào để triển khai các mối quan hệ một-nhiều trong Ibatis?


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

    Class B { 
     int id; 
     // Other properties 
    } 

The Class A có một-nhiều mối quan hệ với lớp B. Tôi đã có một dịch vụ mà lưu trữ đối tượng B và gửi lại chúng trên id.

schema Bảng trông giống như sau


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

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

Bây giờ, làm thế nào để bản đồ này trong iBatis?

Vì đối tượng B đã được lưu trong bộ nhớ cache, tôi muốn lấy danh sách các id vào một đối tượng và sau đó sử dụng dịch vụ để làm phong phú As.

Ai đó có thể đề xuất cách thực hiện?

Hai có thể thay thế tôi có thể nghĩ đến là:

  1. Tạo một lớp bên trong A (bản đồ AtoB) và sử dụng một truy vấn chọn trong iBatis cấu hình để cư này
  2. Bên trong/select sử dụng iBatis resultMap một lựa chọn khác để có danh sách các id B (không quá chắc chắn về cách thực hiện điều này trong cấu hình)

Trả lời

0

Không chắc chắn nếu tôi đã hiểu câu hỏi của bạn một cách chính xác.

Giả sử bạn sẽ truy vấn dựa trên id của A, cách viết truy vấn trong ibatis tham gia hai bảng?

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

Sau đó, bạn có thể sử dụng 'queryForMap' để trả về hashmap của a_id vs (tập hợp các bản ghi từ truy vấn). Sử dụng một phương pháp tùy chỉnh để chuyển đổi cấu trúc dữ liệu này vào một đối tượng của 'A'

+0

Thần ks Rahul. Nhưng vấn đề với cách tiếp cận này sẽ là: "Quá nhiều đối tượng" và chúng tôi sẽ kết thúc làm group_by (tương tự) trong mã. – Jagmal

1

trong mybatis 3 nó hơi khác một chút. Bạn có thể làm điều đó bằng cách chỉ định hai câu lệnh select hoặc bạn có thể sử dụng join rồi tạo resultMap với tag collection.

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

hoặc bạn có thể sử dụng tham gia

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

và làm bản đồ kết quả

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

bạn có thể nhận totorial hoàn chỉnh từ người dùng ibatis hướng dẫn ở đây:

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

Các vấn đề liên quan