gpt4 book ai didi

spring - 我们应该在哪里使用@Transactional,Service层在哪里?

转载 作者:行者123 更新时间:2023-12-02 06:43:37 24 4
gpt4 key购买 nike

我在 Spring 中有休息风格的 Controller 。在 Controller 中我注入(inject)了 dao 接口(interface)。我从 Controller 保存数据。换句话说,我有 REST Web 服务。人们向我发送数据,我保留它。

/**
* Payment rest controller which receives
* JSON of data
*/
@Controller
@RequestMapping("/data")
public class PaymentTransaction {

@Autowired
private TestDao dao;

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody()
public String test(HttpServletRequest request) {

...

}

目前我在 Dao 类中有 @transaction 注释。例如:

    import org.springframework.transaction.annotation.Transactional;
@Component
@Transactional
public interface TestDao {

@Transactional(propagation = Propagation.REQUIRED)
public void first();

}

I have read that this is very bad style. Using this answer在 stackoverflow 上,这里有解释和示例为什么这不好 - 我们也不能在 DAO 和 Controller 中添加此注释。我们必须将其添加到服务层中。

但是我不明白什么是服务层?或者它在哪里?我没有这样的东西。@Transactional 注解应该写在哪里?

最诚挚的问候,

最佳答案

根据cited发布后,您应该像这样设计您的类(而不是伪代码):

  • Controller (负责处理客户端的请求/响应)

    @Controller
    @RequestMapping("/data")
    public class TestREST {
    @Autowired
    private TestService service;

    public void storePayment(PaymentDTO dto) {
    service.storePayment(dto); //request from a client
    }

    public PaymentDTO getPayment(int paymentId) {
    return service.getPayment(paymentId); //response to a client
    }
    }
  • 服务层(也称为业务层,负责业务逻辑 - 知道如何处理传入消息,但不知道它们来自哪里) 。

    public class TestServiceImpl {
    @Autowired
    private TestDao dao;

    @Transactional(propagation=Propagation.REQUIRED) //force transaction
    public void storePayment(PaymentDTO paymentDto) {
    // transform dto -> entity
    dao.storePayment(paymentEntity); //read-write hence transaction is on
    }

    @Transactional(propagation=Propagation.NOT_SUPPORTED) //avoid transaction
    public Payment getPayment(int paymentId) {
    return dao.findPayment(paymentId); //read-only hence no transaction
    }
    }
  • 数据访问层(也称为持久层,负责访问数据库 - 知道如何使用实体模型/ORM,对上层一无所知服务层)

    public class TestDAOImpl {
    @PersistenceContext
    private EntityManager em;

    public void storePayment(PaymentEntity paymentEntity) {
    em.persist(paymentEntity);
    }

    public PaymentEntity getPayment(int paymentId) {
    return em.find(PaymentEntity.class, paymentId);
    }
    }

通过这种方法,您可以实现帖子中提到的关注点分离。另一方面,这种方法(业务层与数据访问层)受到了 Adam Bien 在他的 blog 上的一些批评。 (“JPA/EJB3 杀死了 DAO”)。正如您所看到的,该问题没有单一的解决方案,但我鼓励阅读其他一些意见并应用您认为最适合您需求的解决方案。

关于spring - 我们应该在哪里使用@Transactional,Service层在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26491688/

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