UseGeneratedKeys 不适用于 parameterType="map"
UseGeneratedKeys not working for parameterType="map"
使用 MyBatis 3.2.7
场景一:
POJO:
public class Project {
private Long id;
public Long getId() { ... }
public void setId(...) { ... }
}
道:
public void update(@Param("parentId") long parentId, @Param("project") Project project);
DAO.xml
<update id="updateProject" parameterType="map" useGeneratedKeys="true" keyProperty="project.id" keyColumn="project_id">
鉴于这些 classes/files,我希望如果我使用尚未设置 id 的 Project
调用 DAO 的 update
方法,那么在它被 merged/inserted 进入数据库,project.id
包含生成的 id,但显然它仍然是空的。
场景二:
在同一个 DAO 中,我有另一个运行良好的设置:
POJO:
public class Plan {
private Long id;
public Long getId() { ... }
public void setId(...) { ... }
}
道:
public void update(@Param("plan") Plan plan);
DAO.xml
<update id="updatePlan" parameterType="Plan" useGeneratedKeys="true" keyProperty="id" keyColumn="plan_id">
问题
由于在场景 2 中它工作得很好,在场景 1 中不起作用,我假设在将地图用作 parameterType
时不支持使用生成的密钥。这是真的吗?
解决方法:
<update id="updateProject" parameterType="map">
<selectKey keyProperty="project.id" resultType="Long" order="BEFORE">
select nvl(#{project.id}, project_id_seq.nextval) from dual
</selectKey>
...
</update>
使用 MyBatis 3.2.7
场景一:
POJO:
public class Project {
private Long id;
public Long getId() { ... }
public void setId(...) { ... }
}
道:
public void update(@Param("parentId") long parentId, @Param("project") Project project);
DAO.xml
<update id="updateProject" parameterType="map" useGeneratedKeys="true" keyProperty="project.id" keyColumn="project_id">
鉴于这些 classes/files,我希望如果我使用尚未设置 id 的 Project
调用 DAO 的 update
方法,那么在它被 merged/inserted 进入数据库,project.id
包含生成的 id,但显然它仍然是空的。
场景二:
在同一个 DAO 中,我有另一个运行良好的设置:
POJO:
public class Plan {
private Long id;
public Long getId() { ... }
public void setId(...) { ... }
}
道:
public void update(@Param("plan") Plan plan);
DAO.xml
<update id="updatePlan" parameterType="Plan" useGeneratedKeys="true" keyProperty="id" keyColumn="plan_id">
问题
由于在场景 2 中它工作得很好,在场景 1 中不起作用,我假设在将地图用作 parameterType
时不支持使用生成的密钥。这是真的吗?
解决方法:
<update id="updateProject" parameterType="map">
<selectKey keyProperty="project.id" resultType="Long" order="BEFORE">
select nvl(#{project.id}, project_id_seq.nextval) from dual
</selectKey>
...
</update>