この単純なスキーマを想定しましょう。
create table User (
identity BIGINT UNSIGNED, PRIMARY KEY (identity),
name VARCHAR(32) NOT NULL);
create table Role (
identity BIGINT UNSIGNED, PRIMARY KEY (identity),
name VARCHAR(32) NOT NULL);
create table UserRole (
user_identity BIGINT UNSIGNED REFERENCES User (identity),
role_identity BIGINT UNSIGNED REFERENCES Role (identity),
PRIMARY KEY(user_identity, role_identity));
そして、MyBatisでのこのマッピング:
<select id="SelectUserById" parameterType="long" resultMap="UserResultMap">
select
u.identity as u_identity,
u.name as u_name,
r.identity as r_identity,
r.name as r_name
from
User u
inner join UserRole ur on ur.user_identity = u.identity
inner join Role r on ur.role_identity = r.identity
where
u.identity = #{id}
</select>
<resultMap id="UserResultMap" type="User">
<id property="identity" column="u_identity" />
<result property="name" column="u_name" />
<collection property="roles" column="u_identity" ofType="Role" javaType="ArrayList">
<id property="identity" column="r_identity" />
<result property="name" column="r_name" />
</collection>
</resultMap>
これが私のユーザーBeanの実装です:
public class User {
private Long identity;
private String name;
private List<Role> roles = new ArrayList<Role>();
public Long getIdentity() {
return identity;
}
public void setIdentity(Long identity) {
this.identity = identity;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Role> getRoles() {
return new ArrayList<Role>(roles);
}
public void setRoles(List<Role> roles) {
this.roles = new ArrayList<Role>(roles);
}
}
したがって、ユーザーBeanの実装でロールリストから防御コピーを取得するという事実を除いて、すべてが非常に簡単です。問題は、MyBatisがこれをまったくサポートしていないようであり、結果のロールリストが空になることです。これらのコピーをとらないと、スムーズに動作しますが、デザインが悪くなります。これを回避する方法はありますか?