环境:
Spring 4.0.3
JPA:2.1,底层实现Hibernate 4.3.5.Final
这是我的应用程序中的伪代码。
@Transactional
doRegistration() {
//user insert
entityManager.persist(userObj);
//user permission insert
entityManager.persist(permissionObj);
//find the max id from address table
maxId = entityManager.findAddressMaxId(userObj.userid)
id = maxId + 1;
//other business logics goes here
//insert user address with id
entityManager.persist(addressObj);
}
我的系统中有多个这样的代码块,它们为新id执行最大+1。
有些情况下可能会发生竞争。在这些情况下,由于主键冲突,addressObj插入可能会失败。
我厌倦了@GeneratedValue,在这种情况下的问题是,有一个外部系统对这些表进行相同的注册。除此之外,在某些情况下,我的遗留数据库使用char数据类型作为id。
最不希望添加一些代码级别的更改,以便在异常情况下再次执行地址插入。
org.springframework.transaction.annotation.Transactional中是否有任何选项可以让该方法在没有回滚的情况下再次尝试?
其他想法也是最受欢迎的。