【问题标题】:Spring JPA repo does not seem to save nor does it throws any exceptionSpring JPA repo 似乎没有保存也没有抛出任何异常
【发布时间】:2025-12-12 17:10:01
【问题描述】:

我正在使用Spring boot 2.0.3.RELEASE(FINCHLEY)`starter-data-jpa 2.0.5.RELEASE。 该场景非常基本,构建一个实体并保存它。

在阅读文本之前,让我们先阅读代码以获得更好的上下文。

实体类(Asset):id(主键)不会自动生成,因为我们基本上从另一个来源获得了唯一的UUID.toString(),它肯定是唯一的。

import lombok.*;
import org.springframework.data.domain.Persistable;

import javax.persistence.*;
import java.util.List;

@Setter
@Getter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "ASSET", schema = "SCHEMA")
public class Asset implements Persistable<String> {
// Propriety code hence column names removed. 
//Let's just assume column names are fine, since when I am doing a find(), results are cool

    private static final long serialVersionUID = 1L;

    @Id
    private String id;

    private String creditPool;

    private int quantity;

    private int assetStatusTypeId;

    private long assetTypeId;

    private int ageOfAsset;

    //The below snippet is part of Persistable<String> to force a new entry. Newly added following an answer in *.

    //Here, update is basically false by default, 
    //so as you can see isNew() will always return true forcing jpa to save a new record

    @Transient
    private boolean update;

    @Override
    public String getId() {
        return this.id;
    }

    @Override
    public boolean isNew() {
        return !this.update;
    }
}

根据我添加的 cmets,你看我添加了 sn-p 因为我们没有自动生成 id

如果没有 sn-p 和 Persistable,问题是一样的。

由于业务原因,我的自定义存储库类具有以下自定义保存功能。

@Override
   public <S extends T> S save(S entity, long value) {
       entity.someParams(args getting from from a jar) //which is really fine
       return super.save(entity);
   }

下面是调用save的代码

Asset asset = Asset.builder()
.id(UUID.randomId().toString()) //see always unique
.assetStatusTypeId(a valid id)
.assetTypeId(a valid id)
.creditPool("pool")
.quantity(integer value)
.ageOfAsset(integer value).build();
repo.save(asset);

我已经多次验证了构建器,它确实创建了一个Asset 对象,没有失败。

但罪魁祸首 save 永远不会被处决。

我打开了showSQL:true 来检查插入查询是否被调用。但我没有看到这样的查询。

休眠属性:

jpa:
  show-sql: true
  properties:
    hibernate:
      enable_lazy_load_no_trans: true
      show_sql: true
      format_sql: true
      jdbc:
        batch_size: 5

我考虑了一个场景,即使进行了所有安全检查,JPA 也可能将其视为更新场景,

我忽略了保存并使用了persist。即使这样也没有插入。

repo.persist(asset);

请帮忙。

* Sources for my workarounds 和重复项。 对此的任何帮助将不胜感激。

【问题讨论】:

    标签: java spring-boot spring-data-jpa


    【解决方案1】:

    你应该在保存后刷新或直接使用saveAndFlush(asset)。

    【讨论】:

    • 保存没有被执行,这就是问题所在,你想让我在保存后刷新?
    • 只有在将事务刷新到数据库时才会执行保存。