首页 > 解决方案 > Spring JPA - 更新一个表正在更新后端中的另一个表

问题描述

我在我的项目中使用 Spring JPA 并尝试更新一个表,但它试图在更新我的实际表之前更新另一个 tbale。这是我的代码:我的服务类:

@Service
public class MyServiceImpl {
@Autowired
    private Table1Repository table1Repo;
@Autowired
    private Table2Repo table2Repo;
private void updateDataBaseAction(){
table1Repo.save(Table1);
}
}

@Repository
public interface Table1Repository extends CrudRepository<Table1, table1Id> {
}
@Repository
public interface Table2Repo extends CrudRepository<Table2, table2Id> {
}

实体类是:

@Entity
@Table(name = "TABLE2")
@Component
public class TABLE1Base {
    
    @Id
    @Column(name = "CROS_REF_ID")
    private Long CrosRefNbr;
        
    @Column(name = "STRT_DT")
    private Date strtDt;
    
    @Column(name = "CPTR_DT")
    private Date CptrDt;
    
    @Column(name = "BAS_ST_CD")
    private String basStCD;
    
    @Column(name = "END_DT")
    private Date endDt;
    
    @Column(name = "ADD_EVNT_ID")
    private Long addEvntId;
    
    @Column(name = "LST_UPDT_EVNT_ID")
    private Long lstUpdtEvntId;

    @Column(name = "VOID_EVNT_ID")
    private Long voidEvntId;
    --few more columns as above
    
--setter and getter
}
@Entity
@Table(name = "TABLE1")
@Component
public class Table1 {
    
    @EmbeddedId
    private Table1Id table1Id;

    @Column(name = "CROS_REF_ID")
    private Long crosRefId;

    
    @Column(name = "TYP_CD")
    private String TypCd;
    
    --few more columns with @column annotation
    
    --setter and getters
}

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.10.RELEASE</version>
        <relativePath />
    </parent>

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

我检查时得到的异常日志是:

org.springframework.orm.jpa.JpaSystemException: could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement

我可以在控制台上看到的错误日志是:

Hibernate: update TABLE2 set CPTR_DT=?, ADD_EVNT_ID=?, BAS_ST_CD=?, END_DT=?, LST_UPDT_EVNT_ID=?, SYS_CD=?, SRC_NBR=?, STRT_DT=?, VOID_EVNT_ID=? where CROS_REF_ID=?
[basics-inbound-customerstructure] [14-05-2021 09:07:47.912 ] [ERROR][http-nio-8085-exec-2] [ne.jdbc.spi.SqlExceptionHelper][ndc[]] - ORA-20001: THE NEW START DATE |01-JAN-20 NEW CAPTURE DATE |21-APR-21 NEW CROSS REF ID |167341354| NEW ADD EVENT ID |78639570006|.
ORA-06512: at "TRG_TAB2_NO_UPD", line 2
ORA-04088: error during execution of trigger 'TRG_TAB2_NO_UPD'
2021-05-14 09:07:50.290 ERROR 30164 --- [nio-8085-exec-2] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/customerstructure] threw exception [Request processing failed; nested exception is com.optum.basics.exception.DAOException: Error updating Object Type: 1] with root cause

com.optum.basics.exception.DAOException: Error updating Object Type: 1
    at com.optum.basics.customerstructure.service.impl.MyServiceImpl.updateDataBaseAction(MyServiceImpl.java)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at com.optum.basics.customerstructure.utils.LoggingFilter.doFilterInternal(LoggingFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

它显示的触发器在 table2 上,但实际上我正在尝试更新我的 table1,而 table1 没有触发器来更新 table2。

您能否分享您对我所缺少的东西的想法,并让我知道更多信息?

标签: javaspringspring-data-jpa

解决方案


通过将 @DynamicUpdate 注释添加到我的实体类来解决此问题。


推荐阅读