Hello,

maybe someone can help me out with a problem. I am trying to accomplish some 
complex object mapping like the one described in the user guide. I started with 
a simple demo application to figure out how things work. However after trying 
several times I had to give up. Maybe someone can help out.

In my use case I try to map a user to a location where he is assigned a role.

There are three tables in the database. User and Location are both not very 
special, both have a integer primary key and some other columns. The third 
table 'user_roles' maps users to locations and their assigned roles.

Table user_roles has three attributes. User_id, location_id and a varchar 
role_type. The primary key is (user_id,location_id,role_type).

I use the following sql query to retrieve the data for a named user.

SELECT 
A.ID,
A.USERNAME,
A.LASTNAME,
A.FIRSTNAME,
A.EMAIL,
A.PASSWORD,
A.CREATION_DATE,
B.ID AS LOCATION_ID,
B.NAME AS LOCATION_NAME,
B.STREET AS LOCATION_STREET,
B.ZIP AS LOCATION_ZIP,
B.CITY AS LOCATION_CITY,
C.ROLE_TYPE,
FROM USERS A
LEFT OUTER JOIN USER_ROLES C ON A.ID = C.USER_ID
LEFT OUTER JOIN LOCATIONS B ON C.LOCATION_ID = B.ID 
WHERE USERNAME = <some username>

The domain objects are not very special either.

public class Location implements Serializable {
        
        private static final long serialVersionUID = 5114535561318360375L;
        
        private Integer id;
        private String name;
        private String street;
        private String zip;
        private String city;
        
      // GETTER AND SETTERS
}

public class User implements Serializable {
        
        private static final long serialVersionUID = -7754283129754600689L;
        
        private Integer id;
        private String username;
        private String firstname;
        private String lastname;
        private String email;
        private String passwordHash;
        private Date creationDate;
        private List<Role> roles;

      // GETTER AND SETTERS
}

public class Role implements Serializable {
        
        private static final long serialVersionUID = -3582521815310478925L;
        
        private Location location;
        private RoleType roleType;

       // GETTER AND SETTERS

}

RoleType is an enum.

UserMapper.xml contains the following result map:

<resultMap type="User" id="userResultMap">
        <id property="id" column="ID" />
        <result property="username" column="USERNAME" />
        <result property="lastname" column="LASTNAME" />
        <result property="firstname" column="FIRSTNAME" />
        <result property="email" column="EMAIL" />
        <result property="passwordHash" column="PASSWORD" />
        <result property="creationDate" column="CREATION_DATE" />
        <collection property="roles" ofType="Role">
                <result property="roleType" column="ROLE_TYPE" />
                <association property="location" javaType="Location">
                        <id property="id" column="LOCATION_ID" />
                        <result property="name" column="LOCATION_NAME" />
                        <result property="street" column="LOCATION_STREET" />
                        <result property="zip" column="LOCATION_ZIP" />
                        <result property="city" column="LOCATION_CITY" />
                </association>
        </collection>
</resultMap>

Now to my problem. If my table user_roles has two rows like this:
USER_ID, LOCATION_ID, ROLE_TYPE
2, 2 , 'ADMIN'
2, 3 , 'EMPLOYEE'

My user object looks perfect. The property roles has two elements for both
locations. No problem. In case user_roles looks like this:
2, 2 , 'ADMIN'
2, 3 , 'ADMIN'

Then the property roles has only one element.

Any ideas? Thanks in advance!

Bjoern




---------------------------------------------------------------------
To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
For additional commands, e-mail: user-java-h...@ibatis.apache.org

Reply via email to