可能是我误解/误用了MyBatis类型处理程序,但我发现它们可能导致与表插入方法相关的不兼容问题。
考虑课程:
public class TableA {
int idA;
String name;
// constructors, getters, etc.
}
public class TableB {
int idB;
TableA objA;
Date startDate;
// constructors, getters, etc.
}
我声明了关联表,对于TableB,Id_A是Table_A表行的外键。:
create table Table_A ( int Id_A int auto_increment primary key, name varchar(50) );
create table Table_B ( int Id_B int auto_increment primary key, Id_A int, Start_Date datetime );
我使用方法为TableA,TableAMapper.java声明了一个简单的映射器:
@Insert({ "insert into Table_A ( Id_A, name ) values ( #{idA}, #{name} )" })
@Options(useGeneratedKeys=true, keyProperty="idA")
int insertReturnPK( TableA record );
对于TableBMapper,类型处理程序用于填充TableB.objA,类似的insertReturnPK方法用于objA字段的类型处理程序:
<resultMap id="BaseResultMap" type="TableA">
<id column="Id_B" jdbcType="INTEGER" property="idB" />
<result column="Id_A" jdbcType="INTEGER" property="objA" typeHandler="TableATypeHandler" />
<result column="Start_Date" jdbcType="TIMESTAMP" property="startDate" />
</resultMap>
@Insert({ "insert into Table_B ( Id_A, Id_B, Start_Date )",
"values ( #{idB},",
"#{objA,typeHandler=TableATypeHandler}, #{startDate} )" })
@Options(useGeneratedKeys=true, keyProperty="idA")
int insertReturnPK( TableA record );
TableA Type Handler如下所示:
public class TableATypeHandler extends extends BaseTypeHandler<TableA> {
...
@Override
public void setNonNullParameter( PreparedStatement ps, int colIdx, TableA parameter, JdbcType jdbcType ) throws SQLException {
// code to set the specified column indexed by colIdx in Table_A
}
}
最后问题! TableA.insertReturnPK和TableB.insertReturnPK不兼容。或者更具体地说,他们调用TableATypeHandler.setNonNullParameter有两个非常不同的目的:
MyBatis 不在2中隐式使用TableATypeHandler可以很容易地避免这个问题。或者将setNonNullParameter改为有2个列索引,即一个与ps(目标列索引)相关的索引和一个peratains to parameter(source column index)。
有人碰到过这个吗?是否有解决方法?