java - 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();
你有什么主意吗?我错了吗?
解决方案
该getMultiplierByCariKod
方法被声明性地标记为@Transactional
,即它将被Spring容器拦截以添加事务方面(默认传播、隔离……您可以通过检查注释源TransactionManager
来阅读所有属性)。Transactional
使用标记为的方法Transactional
和适当的 DI-ted bean ( @Component
),该方法将在事务(根据执行上下文创建或检索)边界内运行。
推荐阅读
- r - 任务与 R 和 mlr3 库有重复的行
- ios - GoogleSignIn 修改安全区
- elasticsearch - 我可以从 kibana 搜索中获得弹性搜索查询吗?
- python - python pandas:满足条件并为其赋值
- sql - 使用 datediff 时将数据类型 varchar 转换为数字时出错
- mysql - 在MYSQL中设置一个主键值等于另一个
- mysql - 使用 PHP 从 MYSQL 获取特定数据
- random - 将一个数字分成随机数量的部分,其中每个部分的总和再次形成数字
- python - 使用交叉验证训练 8 个不同的分类器在同一个文件中给出相同的准确度?
- react-native - 导航到页面时,UseEffect 在渲染时返回错误