Java >> Java tutorial >  >> Tag >> mybatis

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");

No
Java tag