mybatisを新しいプロジェクトに使用することにしました。私はSQLにかなり精通しており、最近休止状態でいくつかの悪い経験をしたので、DAOへのより低レベルのアプローチを探しています。
1つを除いて、かなりいいようです。それはコレクションの処理です。
グループとユーザーの2つのPOJOがあり、それらは多対多です。コレクションを持つPOJOは、保存時にテーブル間のMM関係のみを更新する必要があるという設計哲学を決定しました。したがって、たとえば、ユーザーのコレクションを持つグループオブジェクトを保存する場合、設計哲学では、ユーザーは既に保存されている必要があり、データベースにグループとgroup_userリレーションを保存するだけで済みます。
そのため、インターフェイスのsaveGroup関数について、mybatis用に次のXMLマッピングを作成しました。
<insert id="saveGroup" keyColumn="id"
parameterType="se.myapp.domain.Group">
<choose>
<when test="id == null">
INSERT INTO myapp_group (name, description)
VALUES
(#{username}, #{password});
</when>
<otherwise>
UPDATE myapp_group set name=#{name}, description=#{description}
where id=#{id};
</otherwise>
</choose>
<if test="users != null">
create temporary table tmpnewgroups (group_id integer, user_id integer);
insert into tmpnewgroups (group_id, user_id) values (
<foreach collection="users" item="user" open="" close="" separator="),()">
#{id},#{user.id}
</foreach>
);
insert into myapp_user_group(group_id, user_id)
select tmp.group_id, tmp.user_id
from tmpnewgroups tmp
left outer join myapp_user_group ug
on ug.group_id = tmp.group_id and ug.user_id = tmp.user_id
where ug.group_id is null;
delete from myapp_user_group
where group_id = #{id} and user_id not in (select user_id from tmpnewgroups);
</if>
</insert>
これは意図したとおりに機能します(グループを挿入/更新し、ユーザーのコレクションをリレーションとしてデータベースに保存します)。しかし、これがベストプラクティスだとは思いません。アプリケーションは、必要に応じて休止状態に切り替えることができるように作成されているため、コレクションを保存するためのロジックは、データベース層にあることが望ましいです。mybatisには、このような操作を合理化できることに気付いていない「魔法」がありますか?
これを改善する方法について何か考えはありますか?または、アプリケーションの設計を再考し、コレクションの処理をモデルのさらに上に置く必要がありますか?