通过JPA Repository保存Java对象是否正确?自定义插入SQL执行无反应无报错
问题解决方法
- 补充必要的DML操作注解
Spring Data JPA中所有INSERT/UPDATE/DELETE这类修改数据的操作,仅用@Query注解不会被识别为写操作,必须添加@Modifying注解告知框架当前是DML操作,同时需要添加事务保证操作执行,修正后的代码如下:
@Modifying @Transactional @Query(value = "insert into MonthlyGcsBillPaymentL(MONTHLYBILL_PAYMENT_ID,GCS_SEQUENCENO," + "BILLING_CYCLEID," + "GCS_ACCOUNT_ID," + "BILL_DUE_DATE," + "MONTHLY_BILL_AMOUNT," + "BILL_PAID_DATE," + "INACTIVITY_FEE," + "COLLECTOR_STATUS," + "COLLECTOR_STARTDATE," + "GCS_SERVICE_FEE," + "BANK_SERVICE_FEE) " + "VALUES (:#{#obj.monthlybillPaymentId},:#{#obj.gcsSequenceno},:#{#obj.billingCycleid},:#{#obj.gcsAccountId}, " + " :#{#obj.billDueDate}, :#{#obj.monthlyBillAmount}, :#{#obj.billPaidDate},:#{#obj.inactivityFee}, :#{#obj.collectorStatus}, :#{#obj.collectorStartdate} , :#{#obj.gcsServiceFee}, :#{#obj.bankServiceFee} )", nativeQuery = true) public void saveMonthlyBillPaymentCollectorInfo(@Param("obj") MonthlyGcsBillPaymentL obj) { }
- 检查SpEL参数映射是否正确
确认:#{#obj.xxx}中的属性名和MonthlyGcsBillPaymentL实体类的属性名完全一致,严格匹配大小写和拼写,必须和实体类的getter方法对应。 - 检查原生SQL的元数据匹配
确认SQL中的表名MonthlyGcsBillPaymentL、所有字段名和数据库中实际的表、字段完全匹配,原生查询严格区分大小写,拼写错误会导致操作失效。 - 开启SQL日志排查隐藏问题
在项目配置文件中添加如下配置,打印实际执行的SQL和绑定的参数,可快速定位参数错误、约束违反等不直接抛出的异常:
spring: jpa: show-sql: true properties: hibernate: format_sql: true logging: level: org.hibernate.type.descriptor.sql.BasicBinder: trace
- 确认事务提交逻辑正常
如果业务层调用该方法时外层已经配置了事务,确认事务没有被标记为回滚,导致插入操作被静默撤销。
内容的提问来源于stack exchange,提问作者mamoon
相关产品推荐
相关产品推荐

