IBatis를 MyBatis로 바꾸면서 톰캣 WAS를 켤 때마다 xml 에러가 계속 발생하고 있다. 그 중에서도 Result Maps collection already contains value for Common.UserMap 이 에러가 발생한다.
Result Maps collection already contains value for Common.UserMap.
Result Maps collection already contains value for Common.UserMap
이 문제는 mapper를 parse하여 읽어오는데, 여기서 기존에 mapper space와 쿼리문 id가 같은 파일이 여러 개가 있으면 문제가 발생한다.
즉, A라는 XML 파일의 namespace는 A1이고, B라는 XML 파일의 namespace도 A1이다. 근데, 그 안에 있는 쿼리문 ID가 둘 다 B1인 경우 이미 있는 것을 또 가져오니 위의 문제가 발생한다.
현재 프로젝트의 구조는 아래와 같이 되어 있다.
한 패키지 안에 이름은 같은데 뒤의 _oracle, _Tibero만 다르다.
즉, 위에서 말했던 것처럼 namespace도 같고, 쿼리 ID도 같다. 이러니 저런 문제가 발생한다.
위의 해결 방법은 oracle과 tibero의 패키지를 분리해주는 것이다.
위와 같이, mybatis 안에서도 각 db에 따라 oracle, tibero, mssql 등 분리를 해준다.
그리고 나서, context.xml에서 mapperLocations를 설정한다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:/mybatis/tibero/*.xml</value>
<value>classpath:/mybatis/tibero/**/*.xml</value>
<value>classpath:/mybatis/tibero/**/**/*.xml</value>
</list>
</property>
<property name="configLocation" value="/WEB-INF/conf/mybatis/mybatis-config.xml"/>
</bean>
위의 경우, mapperLocations라는 property의 value에 tibero의 경우 변수를 넣을 수 있다.
아래와 같이, 프로퍼티를 관리하는 소스에서 jdbc.db를 던져주면 그 값에 따른 xml 경로를 읽는다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:/mybatis/${jdbc.db}/*.xml</value>
<value>classpath:/mybatis/${jdbc.db}/**/*.xml</value>
<value>classpath:/mybatis/${jdbc.db}/**/**/*.xml</value>
</list>
</property>
<property name="configLocation" value="/WEB-INF/conf/mybatis/mybatis-config.xml"/>
</bean>
이렇게 하니 해결되었다.
최근댓글