我有两个表: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吗?
答案 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变量。