Spring Mybatis получить последний идентификатор вставки с @Transactional

У меня есть две таблицы: User и 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() - ноль. когда я удаляю @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?

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 будет ваша пользовательская переменная POJO.

Другие вопросы по тегам