Spring Boot调用Oracle存储过程遇TransientObjectException问题求助
如何在Spring Boot+Hibernate中正确调用Oracle的IN OUT类型存储过程?
项目环境
- Spring Boot + Hibernate + Oracle数据库
实体类定义
@Entity @Table(name = "student") public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; String name; String address; LocalDateTime createdAt; LocalDateTime updatedAt; // Getter、Setter方法 }
存储过程说明
现有一个Oracle存储过程my_procedure,参数为IN OUT类型:接收List<Student>作为输入,遍历输入列表时自动为每个Student生成id、createdAt和updatedAt字段,最终返回填充完整信息的学生列表。通过SQL脚本直接调用该过程完全正常。
尝试的调用实现
Repository层代码
public interface StudentRepository extends JpaRepository<Student, Long> { @Query(value = "execute my_procedure(:covenants)", nativeQuery = true) List<Student> saveBulk(@Param("students") List<Student> students); }
Service层代码
public class StudentService { @Autowired private StudentRepository studentRepository; public void saveBulk(List<Student> students){ studentRepository.saveBulk(students); } }
执行时抛出的异常
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.myapplication.entity.Student; nested exception is java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.myapplication.entity.Student at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:371) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:235) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551) at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:241) at com.sun.proxy.$Proxy245.saveBulk(Unknown Source)
已尝试的解决方案
曾尝试将@Query替换为@Procedure注解,并在Student实体类上添加@NamedStoredProcedureQuery注解,但问题仍然存在。搜索相关问题未找到匹配的解决方案,请问该如何正确调用这个存储过程?
内容的提问来源于stack exchange,提问作者ktcl
相关产品推荐
相关产品推荐

