Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA save()返回实体_Java_Spring Boot_Jpa_Spring Data Jpa_Spring Data - Fatal编程技术网

Java Spring数据JPA save()返回实体

Java Spring数据JPA save()返回实体,java,spring-boot,jpa,spring-data-jpa,spring-data,Java,Spring Boot,Jpa,Spring Data Jpa,Spring Data,我使用spring引导数据jpa,如下所示 @Entity @Table(name = "invoice") @Getter @Setter @ToString public class Invoice { @Id @Column(name = "inv_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private BigInteger invId; @Colum

我使用spring引导数据jpa,如下所示

 @Entity
  @Table(name = "invoice")
  @Getter
  @Setter
  @ToString
  public class Invoice {


   @Id
    @Column(name = "inv_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private BigInteger invId;

    @Column(name = "external_id")
    private String externalInvoiceId;

    @Column(name = "amount")
    private double amount;

    @JsonIgnore
    @JsonIgnoreProperties
    @Column(name = "status")
    private int status;

    @JsonProperty("status")
    @Transient
    private String invoiceStatus;


    public String getInvoiceStatus() {
        switch (this.status){
            case 1:
                return "INITIATED";
            case 2:
                return "CANCELLED";
            case 3:
                return "SUCCESS";
            case 4:
                return "FAILURE";
            default:
                return "IN PROGRESS";

        }

    }

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at")
    private Date createdAt;

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "updated_at")
    private Date updatedAt;


    @PostPersist
    public void updateExternalID() {
        this.externalInvoiceId="G".concat(String.valueOf(this.invId.multiply(BigInteger.valueOf(1000))))
                                  .concat(String.valueOf(Instant.now().getEpochSecond()));

    }
}
我通过存储库访问此实体,如下所示

public interface InvoicesRepository extends JpaRepository<Invoice, BigInteger> {
}
我正在使用
savedInvoice
并尝试更新状态。要么它没有正确更新状态,要么我在数据库中也找不到记录

不存在回滚

下面是我可以看到的日志,插入语句存在

[XNIO-1 task-1] DEBUG org.hibernate.SQL.logStatement -
    /* insert com.min.app.model.Invoice
        */ insert
        into
            invoice
            (amount, created_at, external_inv_id, status, updated_at)
        values
            (?, ?, ?, ?, ?)
Hibernate:
    /* insert com.min.app.model.Invoice
        */  insert
        into
            invoice
            (amount, created_at, external_inv_id, status, updated_at)
        values
            (?, ?, ?, ?, ?)
状态更新后,我尝试打印
savedInvoice
可以在日志中看到以下内容

Invoice(invId=58, externalInvoiceId=G580001575271905, amount=185.0 status=4, invoiceStatus=FAILURE, createdAt=Mon Dec 02 13:01:45 IST 2019, updatedAt=Mon Dec 02 13:01:45 IST 2019)
上面的记录我在表中看不到


我做错了什么?

您需要在函数调用中执行如下事务,并将@Autowired存储库置于全局级别

class whatever{
@Autowired
    private InvoicesRepository myInvoicesRepository;

//call this function
void doSomething(){
    Invoice transactionInvoice = new Invoice();
    transactionInvoice.setAmount(200.0);
    transactionInvoice.setStatus(1);
    Invoice savedInvoice = myInvoicesRepository.save(transactionInvoice);
}
}

您可能正在任何事务之外创建和修改发票。@JBNizet JpaRepository的保存方法是事务性的。您使用的是什么数据库?设置hibernate记录器并检查是否存在插入statement@SimonMartinelli当然,如果保存然后更新创建的实体的服务不是事务性的,则存储库save()方法将打开一个事务,并在save()返回时提交,因此,该服务修改了一个分离的实体。您可以尝试使用
saveAndFlush
而不是
save
方法吗?即使我没有提供我提到的完整的服务类别,但在应用程序中实际上是这样的。
class whatever{
@Autowired
    private InvoicesRepository myInvoicesRepository;

//call this function
void doSomething(){
    Invoice transactionInvoice = new Invoice();
    transactionInvoice.setAmount(200.0);
    transactionInvoice.setStatus(1);
    Invoice savedInvoice = myInvoicesRepository.save(transactionInvoice);
}
}