gpt4 book ai didi

jakarta-ee - JPA数据访问对象——异常处理和回滚

转载 作者:行者123 更新时间:2023-12-04 02:11:37 27 4
gpt4 key购买 nike

我想知道数据访问对象中异常处理的最佳方式是什么,我对生产质量代码很感兴趣。

举个例子

public UserDaoImpl implements UserDao{
@PersistenceContext
private EntityManager em;

void save(User user){
em.persist(user);
}
User getById(long id){
return em.find(User.class,id);
}
}

比方说,我在某处有一个 RegisterService,在某个时候我想将用户保存到数据库中。并且每个用户都需要有一个唯一的电子邮件。你如何检查这个代码去哪里了?在保存之前,我们是否使用查询检查保存方法中是否已经有该电子邮件的用户?或者该代码是否用于服务?或者我们可能会 try catch 一些异常?

但据我所知,除了异常(exception)情况,我们永远无法确定发生了什么,我们可以 try catch ConstraintViolationException,但这并不能明确告诉我们发生了什么。

它在生产质量代码中看起来如何?

最佳答案

Let's say that for example I have a RegisterService somewhere where at some point I'd like to save the user to the database. And that each User needs to have a unique email. How do you check that and where does this code go ?

在您插入的同一个事务中检查它,并抛出一个触发完全回滚的自定义异常。

checkin 同一个事务将保证数据库在插入过程中不会引发约束违反异常。建议你的“DAO”实际上是一个 @Stateless EJB(基于你用 [java-ee] 而不是 [spring] 标记你的问题的事实),然后每个方法调用默认情况下,客户端计为单个事务。

抛出自定义服务层特定异常会将您的前端(即调用该业务服务方法的任何人,例如 JSF、JAX-RS、Spring MVC、JSP/Servlet 等)与底层持久层分离。换句话说,您的前端代码库完全没有 javax.persistence.* 导入/依赖项。建议您使用 EJB 作为服务层 API,然后使用 @ApplicationException(rollback=true) 注释自定义异常.

例如

@Stateless
public class UserService {

@PersistenceContext
private EntityManager em;

public User findByEmail(String email) {
List<User> users = em.createQuery("SELECT u FROM User u WHERE email = :email", User.class)
.setParameter("email", email)
.getResultList();
return users.isEmpty() ? null : users.get(0);
}

public void register(User user) {
if (findByEmail(user.getEmail()) != null) {
throw new DuplicateEntityException();
}

em.persist(user);
}

// ...
}
@ApplicationException(rollback=true)
public class DuplicateEntityException extends RuntimeException {}

然后,在您的前端,只需捕获特定于自定义服务层的异常(我们现在确定它正是导致异常的预期意外情况)并相应地处理,例如向最终用户显示 “嘿,您已经注册了!也许您想登录或重设密码?” 消息。

另见:

关于jakarta-ee - JPA数据访问对象——异常处理和回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32040779/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com