jpa冲洗或找到之前坚持

时间:2016-02-01 20:31:08

标签: java spring hibernate jpa

在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

我找到了解决它的几个选项:

  • 不使用@Transaction
  • 使用Flush
  • 在调用服务时捕获异常
  • 在坚持之前查找

现在我考虑在em.flush和em.find之间(在坚持之前)。使用哪种方法更好(刷新 - 丢失性能,查找 - 对数据库的冗余请求)?此外,如果我在某处错误,请指出我。

1 个答案:

答案 0 :(得分:1)

有时,刷新可能有助于在正在进行的交易和数据之间保留数据。然后最后提交更改。因此,如果之后出现问题,您也可以回滚以前的更改,例如批量插入/更新。

因此,当您调用em.flush()时,将在数据库中执行插入/更新/删除关联实体的查询。此时将知道任何约束失败(列宽,数据类型,外键)。

在你的情况下,我将使用flush。