UseGeneratedKeys不适用于parameterType =" map"

时间:2016-03-16 14:43:39

标签: java mybatis

使用MyBatis 3.2.7

情景1:

POJO:

public class Project {
    private Long id;

    public Long getId() { ... }
    public void setId(...) { ... }
}

DAO:

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

鉴于这些类/文件,我希望如果我使用尚未设置id的update来调用DAO的Project - 方法,那么在将其合并/插入到数据库,project.id包含生成的ID,但显然它仍为空。

情景2:

在同一个DAO中,我有另一种设置完美无缺:

POJO:

public class Plan {
    private Long id;

    public Long getId() { ... }
    public void setId(...) { ... }
}

DAO:

public void update(@Param("plan") Plan plan);

DAO.xml

<update id="updatePlan" parameterType="Plan" useGeneratedKeys="true" keyProperty="id" keyColumn="plan_id">

问题

由于在方案2中它完全正常并且它在方案1中不起作用,我假设在使用地图parameterType时不支持使用生成的密钥。这是真的吗?

1 个答案:

答案 0 :(得分:1)

<强>解决方案

<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>