Как заставить MyBatis работать с защитными копиями? - PullRequest
0 голосов
/ 30 марта 2012

Давайте предположим, что эта простая схема:

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, похоже, вообще не поддерживает это, и результирующий список ролей будет пустым.Если я не возьму эти копии, это будет работать гладко, но это будет плохой дизайн.Есть ли способ обойти это?

...