私は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つの挿入呼び出しがあります。
ありがとうございました。
可能な複製:https://stackoverflow.com/questions/31649089/mybatis-insert-with-complex-object 関連項目:https://stackoverflow.com/questions/4287544/persist-collection-in-object -with-mybatis –
@GabrielMolinaありがとうございました、私は以前にその質問を見ていませんでした。私は別々のインサートを持っていて、それぞれを別々に呼び出すことにしました。 – George
個々のインサートが道のりです。トランザクションにすべての挿入をラップするだけで、すべての挿入が失敗した場合にそれらはすべてロールバックされます。 – DwB