You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:25:04