我想编写处理来自外部源的事件的逻辑。事件处理是这样的:
- 获取一个事件,将其存储在 postgres 表中。
- 使用 cron,从该表中提取所有事件记录并通过电子邮件发送
- 每次成功提交,相应的事件都会被删除。
我写了这个实体类:
@Entity
@Table(name = "invoice_warning_events")
public class InvoiceWarningEvent {
@Id
@Column(name = "invoice_uid")
@JsonProperty
private String invoiceUid;
@Column(name = "invoice_number")
@JsonProperty
private String invoiceNumber;
@Column(name ="company_msp")
@JsonProperty
private String companyMSP;
@Column(name = "error_message")
@JsonProperty
private String errorMessage;
第一个问题出现在我写的时候JpaRepository。读取了表中的记录,但该方法 invoiceWarningRepository.delete(evt);没有删除任何内容。
然后我尝试挂在@Id-field 注释@GeneratedValue(strategy = GenerationType.AUTO)和@GeneratedValue(strategy = GenerationType.IDENTITY). 在第一种情况下,发生了错误:
id 的未知整数数据类型:java.lang.String;嵌套异常是 org.hibernate.id.IdentifierGenerationException: ids 的未知整数数据类型:java.lang.String
在第二种情况下,我得到一个错误
无法执行语句;SQL [不适用];约束[invoice_uid];嵌套异常是 org.hibernate.exception.ConstraintViolationException:无法执行语句
事实上,invoice_uid 字段必须是唯一的,它被定义为数据库中的主键。这是必要的,因此关于同一张发票的许多事件导致只出现一条记录,该记录不断更新。
如何消除此错误?
还有,如果记录已经存在,可以用什么方法来实现插入或更新操作?
1)关于删除:
JpaRepository只有2个方法:deleteById和deleteAll。
请参阅此链接:https ://www.baeldung.com/spring-data-jpa-delete
从这里您应该获取行 ID 并按 ID 删除
2) 你需要有 2 个更好的 ID:
- 表中行的
ID - 发票的 ID
那是:
3)关于生成值 - 尝试使用自定义)在这里看到