
典型的java web应用会采用分层架构,例如:
当需要删除一条记录时,前端通常会向控制器发送一个标识符(如ID)。此时,开发者面临一个选择:是将这个ID直接传递到服务层和DAO层进行删除,还是在控制器层先根据ID检索出完整的模型对象,再将模型对象传递下去进行删除。
这是在大多数删除场景下推荐的做法。
// Controller层
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
// Service层
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void deleteUser(Long id) {
// 可选:在这里添加业务逻辑,例如权限检查
userDao.delete(id);
}
}
// DAO层
@Repository
public class UserDao {
@PersistenceContext
private EntityManager entityManager; // 或使用SessionFactory
public void delete(Long id) {
// 推荐使用getReference()或createQuery()来避免不必要的select
// entityManager.remove(entityManager.getReference(User.class, id));
// 更直接的方式是使用JPQL或HQL进行批量删除,或通过id查找后删除
User user = entityManager.find(User.class, id); // 实际操作中,如果仅知ID,通常不需要先find
if (user != null) {
entityManager.remove(user);
} else {
// 处理记录不存在的情况
throw new EntityNotFoundException("User with ID " + id + " not found.");
}
// 或者直接通过JPQL/HQL删除,效率更高,但不会触发级联删除(如果配置了)
// Query query = entityManager.createQuery("DELETE FROM User u WHERE u.id = :id");
// query.setParameter("id", id);
// query.executeUpdate();
}
}这种方法通常不推荐用于简单的删除操作。
只有在极少数情况下,如果删除操作需要基于实体对象的完整当前状态进行复杂的业务逻辑判断(例如,在删除前需要检查多个字段的值或执行复杂的审计操作),才可能考虑在服务层(而非控制器层)先加载实体。但即便如此,也应将加载操作放在服务层内部,以保持控制器层的轻量级。对于绝大多数删除场景,直接通过ID删除是更优选择。
开发者有时会误解“我们应该通过模型而非参数传递数据”这一原则。这个原则更多地适用于数据创建、更新或需要传递复杂业务上下文的场景。在这种情况下,一个包含多个字段的DTO(数据传输对象)或领域模型可以更好地封装数据,避免方法签名过长或参数过多。
然而,对于基于唯一标识符的简单操作,如检索(findById(id))或删除(deleteById(id)),直接传递ID是完全合理且更高效的。ID本身就是一种简洁而明确的“参数”,足以完成特定任务,无需加载整个模型。
在Spring MVC与Hibernate的删除操作中,最佳实践是:
遵循这些原则,可以构建出高效、可维护且符合分层架构最佳实践的Spring MVC与Hibernate应用程序。
以上就是Spring MVC与Hibernate删除操作:ID或模型传递的最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号