java - Spring Data JPA save() 返回实体
问题描述
我正在使用 Spring Boot 数据 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> {
}
在我@Service
执行以下操作时
@Autowired
private InvoicesRepository myInvoicesRepository;
Invoice transactionInvoice = new Invoice();
transactionInvoice.setAmount(200.0);
transactionInvoice.setStatus(1);
Invoice savedInvoice = myInvoicesRepository.save(transactionInvoice);
正在使用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 存储库放在全局级别 ass 中。
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);
}
}
推荐阅读
- ios - 当我的视图加载时,Swift Ui Firebase 数组为空
- javascript - getCoordinates() 函数返回错误的坐标
- java - 如何使用 Swing JAVA 显示带有表情符号的标签
- c# - 为什么统一无法识别我的左移键
- sensors - MODBUS RTU-RS485 ISSUE 温度和湿度,不能同时读取
- version-control - 在 CVS 中如何忽略已经签入的文件
- vuejs2 - 如何根据 VUEJS 中选定的单选按钮显示单选按钮
- c - 释放 void 指针会导致段错误
- google-workflows - 如何最好地使用 Google Cloud Workflows 回填数据
- javascript - 如何创建加密优惠券代码生成/验证系统?