MyBatis - Mapped Statements-samlingen indeholder allerede værdi for
Jeg fandt ud af årsagen til fejlmeddelelsen. Hvis du har samme metodenavn, kaster mybatis Mapped Statements collection already contains value
fejl besked. Så løsningen er at have forskellige metodenavne for forskellige mapper-sætninger, selvom metodesignaturerne er forskellige.
Så i min mapper interface navngiver metoden anden getAllUsers()
navn skal være getUserById();
. Den samme fejl opstår, hvis du har det samme metodenavn i nogen af mapper.xml
filer. Så det er obligatorisk at have unikke metodenavne eller mapper-navneområde til forskellige sql-sætninger, for at mybatis kan kortlægge dette under kørsel.
I mit tilfælde skyldtes forekomsten, at resultMaps blev tilføjet til konfigurationen efter tilføjelse af mapper.
F.eks.:
Configuration configuration = new Configuration(environment);
configuration.addMappers("com.hemant.data.mapper");
configuration.addResultMap(getResultMapForRoles(configuration));
Hvis vi observerer MyBatis-kildekoden, så udføres onconfiguration.addMappers(..) ..... parse().org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse()org.apache.ibatis. builder.annotation.MapperAnnotationBuilder.parseStatement(Method)
for (Method method : methods) {
try {
// issue #237
if (!method.isBridge()) {
parseStatement(method);
}
} catch (IncompleteElementException e) {
configuration.addIncompleteMethod(new MethodResolver(this, method));
}
}
Hvis der er et problem med at parse sætningen (som opstod i mit tilfælde, da sætningen havde @ResultMap-annotering, men resultMap ikke blev leveret til konfigurationen.), tilføjes metoden i INCOMPLETE_METHODS i konfigurationen, hvilket senere rejser undtagelsen.
@Select("select role_id, role_name, allowed_actions::bigint, denied_actions::bigint from acm_role")
@ResultMap("com.hemant.data.mapper.RoleMapper." + PermissionDBHook.ROLE_MAP)
public List<Role> getAllRoles();
Ved at tilføje resultMap til konfiguration før mapper, løste det
Configuration configuration = new Configuration(environment);
//Hemant - result map should be added before mappers
configuration.addResultMap(getResultMapForRoles(configuration));
configuration.addMappers("com.hemant.data.mapper");