Давайте предположим, что эта простая схема:
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>
Вот реализация моего пользовательского компонента:
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);
}
}
Так что все довольно просто, за исключением того факта, что я использую защитные копии из списка ролей в моей реализации компонента пользователя.Проблема в том, что MyBatis, похоже, вообще не поддерживает это, и результирующий список ролей будет пустым.Если я не возьму эти копии, это будет работать гладко, но это будет плохой дизайн.Есть ли способ обойти это?