首页 > 解决方案 > em 可以在不被创建为 Spring Boot 中的实体管理器的情况下完成工作吗?

问题描述

我面前有一些代码,我预计会发现一个错误。

我的团队负责人说有一个程序可以获取数据并填充数据库。并告诉我找出错误

我得到了一个完成的项目,我找到了程序,它在这里->

@Procedure(name = "SP_Order_Series_Multiplier")
double getMultiplierByCariKod(@Param("CariKod") String cariKod);

我在这里找到了它的作用。

@Transactional
public Double getMultiplierByCariKod(String cariKod) {
    StoredProcedureQuery query = em.createNamedStoredProcedureQuery("SP_Order_Series_Multiplier");
    query.registerStoredProcedureParameter("CariKod", String.class, ParameterMode.IN);
    query.registerStoredProcedureParameter("Multiplier", Double.class, ParameterMode.OUT);
    query.setParameter("CariKod", cariKod);
    query.execute();
    return (Double) query.getOutputParameterValue("Multiplier");
}

我查看了之前是否创建了 em,但它只写为

@Autowired
EntityManager em;

我想我们应该说这样的话

EntityManager em = emf.createEntityManager(); 
em.getTransaction().begin();

而且没有像这样的代码

em.getTransaction().commit();
em.close();

你有什么主意吗?我错了吗?

标签: javaspringspring-boot

解决方案


getMultiplierByCariKod方法被声明性地标记为@Transactional,即它将被Spring容器拦截以添加事务方面(默认传播、隔离……您可以通过检查注释源TransactionManager来阅读所有属性)。Transactional

使用标记为的方法Transactional和适当的 DI-ted bean ( @Component),该方法将在事务(根据执行上下文创建或检索)边界内运行。


推荐阅读