如何解决如何在@PreUpdate
我正在更新一个实体,我想在@PreUpdate方法内抛出DataIntegrityViolationException并尝试在调用方中捕获此异常并使用适当的错误消息进行处理。但是我无法在控制器中捕获它。
我收到错误消息说“无法提交JPA事务;嵌套的异常是javax.persistence.RollbackException:提交事务时出错”,这是邮递员的响应。
@PreUpdate
public void preUpdateCheck(EmployeeEventType employeeType) {
String employeeTypeCode = employeeType.getCode();
EntityManager entityManager = entityManagerFactory.createEntityManager();
Session session = entityManager.unwrap(Session.class);
EmployeeEventType employeeTypeFromDB = session.get(EmployeeEventType.class,employeeType.getId());
if (employeeTypeFromDB != null && !employeeTypeFromDB.getEvent().name().equals(employeeType.getEvent().name())
&& employeeRepository.existsByeventTypeCode(employeeTypeCode)) {
log.error(
"You cannot update this Time Event Type {} as its already in use with a Time Event.",employeeTypeCode);
throw new DataIntegrityViolationException(
"You cannot update this Time Event Type " + employeeTypeCode
+ " as its already in use with a Time Event.");
}
}
例外:
由以下原因引起:org.springframework.dao.DataIntegrityViolationException:您无法更新此时间事件类型CI,因为它已与时间事件一起使用。 在com.test.core.repositories.jpa.listener.EmployeeEventTypeEntityListener.preUpdateCheck(EmployeeEventTypeEntityListener.java:56) 在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.base / java.lang.reflect.Method.invoke(Method.java:566) 在org.hibernate.jpa.event.internal.ListenerCallback.performCallback(ListenerCallback.java:35) 在org.hibernate.jpa.event.internal.CallbackRegistryImpl.callback(CallbackRegistryImpl.java:95) 在org.hibernate.jpa.event.internal.CallbackRegistryImpl.preUpdate(CallbackRegistryImpl.java:69) 在org.hibernate.event.internal.DefaultFlushEntityEventListener.invokeInterceptor(DefaultFlushEntityEventListener.java:366) 在org.hibernate.event.internal.DefaultFlushEntityEventListener.handleInterception(DefaultFlushEntityEventListener.java:348) 在org.hibernate.event.internal.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:299) 在org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:170)处 在org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:232) 在org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:92) 在org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) 在org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102) 在org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1360) 在org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:451) 在org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3210) 在org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2378) 在org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)处 在org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)处 在org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access $ 300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) 在org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl $ TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)处 在org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) ...省略了118个通用框架
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。