在Spring声明式事务管理中,当您尝试持久化已存在于数据库中的某个实体时,仅在Spring事务提交期间获得DataIntegrityViolationException。因此,此方法不起作用,@Repository
public class UserDAOImpl implements UserDAO {
@PersistenceContext
EntityManager em;
@Override
public void createUserRole(String role) throws RoleAlreadyExistsException {
try {
UserRole userRole = new UserRole(role);
em.persist(userRole);
} catch (Exception e) {
throw new RoleAlreadyExistsException();
}
}
}
括号中的异常不会在此处捕获:
@Service("userService")
public class UserService
@Transactional
public void createUserRole(String role) throws RoleAlreadyExistsException {
userDao.createUserRole(role);
}
}
仅在最后:
$ git init
Initialized empty Git repository in /home/choroba/...
$ echo > a
$ git add a
$ git commit -m init
[master (root-commit) d686390] init
1 file changed, 1 insertion(+)
create mode 100644 a
$ touch -m a
$ git status
On branch master
nothing to commit, working directory clean
我找到了解决它的几个选项:
现在我考虑在em.flush和em.find之间(在坚持之前)。使用哪种方法更好(刷新 - 丢失性能,查找 - 对数据库的冗余请求)?此外,如果我在某处错误,请指出我。
答案 0 :(得分:1)
有时,刷新可能有助于在正在进行的交易和数据之间保留数据。然后最后提交更改。因此,如果之后出现问题,您也可以回滚以前的更改,例如批量插入/更新。
因此,当您调用em.flush()
时,将在数据库中执行插入/更新/删除关联实体的查询。此时将知道任何约束失败(列宽,数据类型,外键)。
在你的情况下,我将使用flush。