2017-08-07 9 views
0

私は1つのブロックで複数のテーブルに挿入することができますが、成功していない挿入ステートメントを作成しようとしています。次に例を示します。MyBatis Complex Insert

Javaオブジェクト:私はそれを行うことが可能であるかどうかを知りたい

public class Parent { 
    String parentId; 
    List<Child> children; 
    ...getters and setters... 
} 

public class Child { 
    String childId; 
    List<Toy> toys; 
    ...getters and setters... 
} 

public class Toy { 
    String toyId; 
    String color; 
    ...getters and setters... 
} 

MySQLテーブル

create table TOY (TOY_ID varchar(10), COLOR varchar(10), CHILD_ID varchar(10), 
    primary key(TOY_ID), foreign key (CHILD_ID) references CHILD(CHILD_ID)); 

create table CHILD (CHILD_ID varchar(10), PARENT_ID varchar(10), 
    primary key(CHILD_ID), foreign key (PARENT_ID) references PARENT(PARENT_ID)); 

create table PARENT (PARENT_ID varchar(10), primary key(PARENT_ID)); 

mapper.xml

<resultMap id="ToyResult" type="Toy"> 
    <id property="toyId" column="TOY_ID"/> 
    <result property="color" column="COLOR"/> 
</resultMap> 

<resultMap id="ChildResult" type="Child"> 
    <id property="childId" column="CHILD_ID"/> 
    <collection property="toys" ofType="Toy" resultMap="ToyResult"/> 
</resultMap> 

<resultMap id="ParentResult" type="Parent"> 
    <id property="parentId" column="PARENT_ID"/> 
    <collection property="children" ofType="Child" resultMap="childResult"/> 
</resultMap> 

次のようなマッピングを挿入します。

<insert id="insertParentData" parameterType="Parent"> 
    insert into PARENT(PARENT_ID) values(#{parentId}); 

    insert into CHILD(CHILD_ID, PARENT_ID) values 
     <foreach collection="children" item="childItem" index="index0" separator=","> 
     (#{childItem.childId}, #{parentId}) 
     </foreach>; 

    insert into TOY(TOY_ID, COLOR, CHILD_ID) values 
     <foreach collection="children" item="childItem" index="index0" separator=","> 
      <foreach collection="childItem.toys" item="toyItem" index="index1" separator=","> 
      (#{toyItem.toyId}, #{toyItem.color}, #{childItem.childId}) 
     </foreach> 
     </foreach> 
</insert> 

私は私のSQL構文にエラーがあるというエラーメッセージが出てきました。それはinsert into CHILD行を指摘しています。この挿入方法が不可能な場合

、どのように私は挿入文をマッピングすることをお勧め?私はParentMapper、ChildMapper、およびToyMapper xmlファイルを作成することができ、私の親データアクセスオブジェクトには、それぞれ異なるマッパーを使用して異なるテーブルに挿入する3つの挿入呼び出しがあります。

ありがとうございました。

+0

可能な複製:https://stackoverflow.com/questions/31649089/mybatis-insert-with-complex-object 関連項目:https://stackoverflow.com/questions/4287544/persist-collection-in-object -with-mybatis –

+0

@GabrielMolinaありがとうございました、私は以前にその質問を見ていませんでした。私は別々のインサートを持っていて、それぞれを別々に呼び出すことにしました。 – George

+0

個々のインサートが道のりです。トランザクションにすべての挿入をラップするだけで、すべての挿入が失敗した場合にそれらはすべてロールバックされます。 – DwB

答えて

0

各クエリの要素がなければなりません。たぶんあなたは親insertの後に "insertToys"メソッドを再帰的に呼び出す子の "insertChildren"メソッドを呼び出す "insertParent" Javaメソッドを作ることができます。

0

私は、3つの別々のインサートに大きな挿入部を分離し、私のDAOでそれらを呼び出すことによって、問題を解決しました。