0

この単純なスキーマを想定しましょう。

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がこれをまったくサポートしていないようであり、結果のロールリストが空になることです。これらのコピーをとらないと、スムーズに動作しますが、デザインが悪くなります。これを回避する方法はありますか?

4

0 に答える 0