我们有一个通过API端点接收JSON事务的应用程序。每条消息都记录到我们数据库中的一个表中。该表的主键是控制号和时间戳的组合。该代码通过使用主键上的JPA存储库exist方法检查传入记录是否重复。在2月的前2周中,有9条传入记录被标记为重复记录。研究完每条记录后,其中5条被正确标识为重复项,而其中4条记录不应标记为重复项。我无法在数据库中找到这4条记录的另一条记录。我不确定为什么系统认为这4个重复。我确实注意到,TransactionMessageId将ctrlNbr定义为Long,并且构造函数将long与Long用作参数。这可能是造成问题的原因吗?我不确定是什么原因导致某些记录正确识别为重复记录,而某些记录被错误识别为重复记录不一致。任何建议将不胜感激。谢谢。
TransactionMessageId中的哈希码是Message对象的哈希,不包括原始JSON
TransactionMessageId
@Data
@Embeddable
public class TransactionMessageId implements Serializable {
private static final long serialVersionUID = 1L;
private Long ctrlNbr;
private Timestamp trnsmTs;
protected TransactionMessageId() {}
public TransactionMessageId(long hashCode, Timestamp ts) {
ctrlNbr = hashCode;
trnsmTs = ts;
};
TransactionMessage实体
@Data
@EqualsAndHashCode(callSuper=false, exclude = "posMessage")
@ToString(exclude = "posMessage")
@Entity
@Table(name = "TRANS_MESSAGE")
public class TransactionMessage extends BaseEntity implements
Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
@NotNull
private TransactionMessageId id;
消息对象
@Data
@EqualsAndHashCode(exclude={"rawJson"})
@JsonIgnoreProperties(ignoreUnknown = true)
public class Message {
private String storeNumber;
private Short registerNumber;
private Integer transId;
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate tranSalesDate;
private String rawJson;
检查数据库中是否已存在事务的方法
@Transactional
private void save(TransactionMessage tm) throws Exception {
if (transactionMessageRepository.exists(tm.getId())) {
throw new
DataIntegrityViolationException("PK_TRANS_DATA_COMP_KEY");
}
TransactionMessageRepository
@Repository
public interface TransactionMessageRepository extends
CrudRepository<TransactionMessage, TransactionMessageId> {
}