2015-07-27 23 views
8

Tôi có các tình huống sau:MyBatis, chèn với đối tượng phức tạp

public class MyObj{ 
    private String myField_1 
    private String myField_2 
    private MyChildObj myChild 
    // Constructor & get/set 
} 

public class MyChildObj{ 
    private String myField_3 
    private String myField_4 
    // Constructor & get/set 
} 

trên Query.xml của tôi đã viết chèn theo cách này:

<insert id="insertMyObj" parameterType="MyObj"> 
    INSERT INTO MY_TABLE ( FIELD_1, 
           FIELD_2, 
           FIELD_3, 
           FIELD_4) 
    values ( #{myField_1}, 
       #{myField_2}, 
       #{myField_3}, 
       #{myField_4}, 
    ) 
</insert> 

sau khi đọc kết quả mybatis Bản đồ hướng dẫn tôi đã cố gắng để thêm các dòng sau vào tệp mybatis-config.xml:

<typeAliases> 
    <typeAlias alias="MyObj"  type="myPackage.MyObj"/> 
    <typeAlias alias="MyChildObj" type="myPackage.MyChildObj"/> 
</typeAliases> 

<resultMap id="insertObj" type="MyObj"> 
    <result property="myField_1" column="FIELD_1"/> 
    <result property="myField_2" column="FIELD_2"/> 
    <association property="PrimaryKeyMap" resultMap="PrimaryKey"/> 
</resultMap> 

<resultMap id="PrimaryKeyMap" type="PrimaryKey"> 
    <result property=myField_3 column="FIELD_3"/> 
    <result property="myField_4" column="FIELD_4"/> 
</resultMap> 

nhưng tôi tiếp tục gặp lỗi sau:

### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: xx; columnNumber: xx; Element type "resultMap" must be declared. 

Có ai có thể làm rõ cho tôi cách thiết lập điều này không?

Trả lời

7

Các resultMap thuộc tính trong <association> cần phải đề cập đến tên của bản đồ kết quả của bạn, không phải là loại Java: <association property="MyChildObject" resultMap="PrimaryKeyMap"/>

Tuy nhiên, nếu MyChildObject được lưu trữ trong cơ sở dữ liệu như một bảng riêng biệt, chèn lồng nhau là not supported. Bạn sẽ cần phải gọi cả hai chèn trong Java. ResultMaps là dành cho chọn.

Nếu bạn chỉ cần đặt một vài cột từ một bảng trong một đối tượng riêng biệt, thì bạn có thể làm điều này với ký hiệu dấu chấm, myChildObject.myField_4. Một cái gì đó như thế này:

<insert id="insertMyObj" parameterType="MyObj"> 
    INSERT INTO MY_TABLE ( FIELD_1, 
           FIELD_2, 
           FIELD_3, 
           FIELD_4) 
    values ( #{myField_1}, 
       #{myField_2}, 
       #{myChildObject.myField_3}, 
       #{myChildObject.myField_4}, 
) 
</insert> 
+0

MyChildObject là khóa chính cho bảng đó. Tôi sẽ thử ngay bây giờ, cảm ơn trước, tôi sẽ viết lại càng sớm càng tốt! – Koop4

+0

Đủ để thay đổi truy vấn khi bạn đề xuất! Cảm ơn một lần nữa! – Koop4

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