Непоследовательные результаты с использованием метода JPA Crud Repository Exists - PullRequest
0 голосов
/ 16 февраля 2019

У нас есть приложение, которое получает транзакции 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> {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...