spring mybatis使用@Transactional获取最后一个插入ID

时间:2015-04-14 13:34:00

标签: spring transactions mybatis

我有两个表:User和SocialAccount。一个用户可以拥有许多socialAccount。

我必须在创建socialAccount之前创建用户:

@Transactional
public SocialAccount create(SocialAccount socialAccount) {
    if (socialAccount.getUserId() == null) {
        User user = new User();
        userDao.createUser(user);
        System.out.println(user.getId());

        if(user.getId() == null){
            return null;
        }

        socialAccount.setUserId(user.getId());
    }
    return socialAccountDao.create(socialAccount);
}

在这个方法中,首先我创建一个用户,但是使用@Transactional我得到user.getId()为null。当我删除@Transactional时,user.getId()是正常的。

这是我的春季配置:

<bean name="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

这里是userDao.createUser()方法:

public User createUser(User user) {
    int affectedNum = super.getSqlSession().insert("UserSQL.createUser", user);
    if (affectedNum > 0) {
        return user;
    }
    return null;
}

我的映射器是:

<insert id="createUser" parameterType="User">
    <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >
        SELECT LAST_INSERT_ID() as id
    </selectKey>
    INSERT INTO User(CTIME, UTIME) VALUES (now(), now())
</insert>

有些人可以告诉我如何使用@Transactional获取用户ID吗?

1 个答案:

答案 0 :(得分:1)

尝试使用映射器XML中的以下更改。

<insert id="createUser" parameterType="User">
    INSERT INTO User(CTIME, UTIME) VALUES (now(), now())
    <selectKey resultType="User" keyProperty="id" order="AFTER" >
        SELECT LAST_INSERT_ID() as id
    </selectKey>        
</insert>

这里的Selectkey标签keyProperty id将是你的用户POJO变量。