首页 > 解决方案 > JpaSystemException:无法提取结果集

问题描述

.save()在 Spring Boot 应用程序中的调用中遇到以下异常。我正在运行 Spring Boot 2.2.5.RELEASE

堆栈跟踪太大,无法包含在此处,因此我已在此链接中共享它。

这是代码:

Search search = new Search();

// ......Build Search Object here

searchRepository.save(search);

public interface searchRepository
    extends BaseJpaRepository<Search, Long>, JpaSpecificationExecutor<Search> {

}

@Data
@Entity
@Table(name = "search")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Search extends AbstractAuditingEntity implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @NotNull
  @Column(name = "externalId")
  private Long externalId;

  @NotNull
  @Column(name = "search_term")
  private String searchTerm;

  @NotNull
  @Column(name = "filters")
  private String filters;

  @NotNull
  @Column(name = "results")
  private Long results;

  @Override
  public int hashCode() {
    return id != null ? id.hashCode() : IntegerUtils.ANSWER_TO_LIFE_THE_UNIVERSE_AND_EVERYTHING;
  }
}

我已通过 IDE 上的调试模式确保所有@NotNull字段都不包含 Null。我还在 application.yml 中添加了以下缺失值:

jpa:
   hibernate:
       naming:
           implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
           physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

在 stackoverflow 上查看了多个其他答案,但没有任何关于此错误的信息。我最近升级了我的弹簧靴,从那时起这个错误就一直出现。此外,我能够读/写弹簧会话表,所以我假设这不是配置问题?

我究竟做错了什么?

标签: javaspring-boothibernatejpaspring-data-jpa

解决方案


引发此堆栈错误的原因是因为默认情况下我的休眠事务设置为readOnly = true. 我从中调用 .save() 方法的类有注释@Transactional,而该方法没有任何注释。所以 .save() 会尝试改变模型并且会失败。所以我决定@Transactional(readOnly=false)使用我的方法,因为它正在写入数据库,它似乎已经解决了这个问题。


推荐阅读