使用通用mapper,无法获取到对应的实体类:
看上面的图片中,可以定位到报错的地方时:EntityHelper.getEntityTable,点进去之后,
public static EntityTable getEntityTable(Class<?> entityClass) {
EntityTable entityTable = (EntityTable)entityTableMap.get(entityClass);
if (entityTable == null) {
throw new MapperException("无法获取实体类" + entityClass.getCanonicalName() + "对应的表名!");
} else {
return entityTable;
}
}
没有找到实体对象是因为entityTableMap 中没有数据,而entityTableMap 是初始化的时候就会加载的:
public static synchronized void initEntityNameMap(Class<?> entityClass, Config config) {
if (entityTableMap.get(entityClass) == null) {
Style style = config.getStyle();
if (entityClass.isAnnotationPresent(NameStyle.class)) {
NameStyle nameStyle = (NameStyle)entityClass.getAnnotation(NameStyle.class);
style = nameStyle.value();
}
EntityTable entityTable = null;
Table fields;
if (entityClass.isAnnotationPresent(Table.class)) {
fields = (Table)entityClass.getAnnotation(Table.class);
if (!fields.name().equals("")) {
entityTable = new EntityTable(entityClass);
entityTable.setTable(fields);
}
}
if (entityTable == null) {
entityTable = new EntityTable(entityClass);
entityTable.setName(StringUtil.convertByStyle(entityClass.getSimpleName(), style));
}
entityTable.setEntityClassColumns(new LinkedHashSet());
entityTable.setEntityClassPKColumns(new LinkedHashSet());
fields = null;
List fields;
if (config.isEnableMethodAnnotation()) {
fields = FieldHelper.getAll(entityClass);
} else {
fields = FieldHelper.getFields(entityClass);
}
Iterator var5 = fields.iterator();
while(true) {
EntityField field;
do {
if (!var5.hasNext()) {
if (entityTable.getEntityClassPKColumns().size() == 0) {
entityTable.setEntityClassPKColumns(entityTable.getEntityClassColumns());
}
entityTable.initPropertyMap();
entityTableMap.put(entityClass, entityTable);
return;
}
field = (EntityField)var5.next();
} while(config.isUseSimpleType() && !SimpleTypeUtil.isSimpleType(field.getJavaType()));
processField(entityTable, style, field);
}
}
}
也就是说,在加载项目的配置文件的时候就会去加载好,但是现在没有。
查找解决问题的原因,很多都是说spring-boot的,我的项目是ssm框架的,所以我觉得应该是在spring加载的时候要处理的:只要查看spring-mybatis的配置:
果然:使用通用mapper,使用的是tk包的mybatis,不是org的,将org 的mybatis换成tk就可以了:
<!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
<!--<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">-->
<!--<!– 注入sqlSessionFactory –>-->
<!--<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>-->
<!--<!– 给出需要扫描Dao接口包 –>-->
<!--<property name="basePackage" value="XXXX"/>-->
<!--</bean>-->
<!-- Spring 与 Mybatis 整合配置,扫描所有 Mapper -->
<!--如果使用的是通用mapper 需要将mapper的扫描配置换成tk包下的-->
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="XXXXX"/>
<!-- 3.2.2版本新特性,markerInterface 可以起到 mappers 配置的作用,详细情况需要看 Marker 接口类 -->
<!--<property name="markerInterface" value="XXXX.mapper"/>-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
这样就解决掉了