У нас есть приложение, которое получает транзакции JSON через нашу конечную точку API.Каждое сообщение заносится в таблицу в нашей базе данных.Первичный ключ таблицы представляет собой комбинацию контрольного числа и отметки времени.Код проверяет, является ли входящая запись дубликатом, используя метод репозитория JPA для первичного ключа.В первые 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> {
}