Spring boot JPA не возвращает существующий результат, используя findById - PullRequest
1 голос
/ 12 февраля 2020

Я создал довольно маленькое и простое приложение Spring Boot, используя базу данных Oracle и некоторые запросы JPA.

Это фрагмент кода, который не возвращает данные, которые фактически существуют в базе данных.

letterRecipientNonOas = letterRecipientNonOasRepository
                            .findById(Long.valueOf(letterRecipientDTO.getNonOas().getId()))
                            .orElseThrow(() -> new EntityNotFoundException(LetterRecipientNonOas.class,
                                    Constant.MESSAGE_ENTITY_NOT_FOUND));

здесь findById возвращает пустой набор результатов.

это мой репозиторий

package com.care.document.repository;

import java.util.List;
import java.util.Optional;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import com.care.document.model.LetterRecipientNonOas;

/**
 * The Interface LetterRecipientNonOasRepository.
 */
@Repository
public interface LetterRecipientNonOasRepository extends PagingAndSortingRepository<LetterRecipientNonOas, Long> {

    Optional<LetterRecipientNonOas> findByLetterId(Long id);

    Optional<LetterRecipientNonOas> findByTitleIgnoreCase(String title);

    List<LetterRecipientNonOas> findByTitleContainingIgnoreCase(String title);

    List<LetterRecipientNonOas> findAllByTitleIgnoreCaseAndIdNot(String title, Long recipientId);

    List<LetterRecipientNonOas> findAllByIdAndLetterId(long id, long letterId);

}

и это мой класс модели:

package com.care.document.model;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import javax.persistence.Table;

import org.springframework.lang.Nullable;

import com.care.admin.model.BaseEntity;
import com.care.admin.util.CommonUtil;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.FieldDefaults;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "letter_recipient_non_oas")
public class LetterRecipientNonOas extends BaseEntity implements Serializable {

    @Id
    Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "letter_id")
    Letter letter;

    Integer recipientType; // Action/Info

    //byte recipientSubType; // Internal/External/NonOAS

    byte recipientCategory; //Internal/External
    int orderNo;
    String title;

    @Nullable
    String remarks;

    String address;

    @PrePersist
    private void prePersist() {
        this.id = CommonUtil.generateID(this.atRegion);
    }
}

Я проверял, пробовал разные способы, но безрезультатно.

1 Ответ

1 голос
/ 12 февраля 2020

Есть несколько сценариев ios, как можно получить такое впечатление:

  1. Вы просматриваете не ту базу данных.
  2. Данные еще не были получены, когда вы пытаетесь загрузить его, но это когда вы проверяете. Известно, что JPA-кэши довольно эффективно создают такой сценарий ios.
  3. Данные выглядят немного иначе, чем вы думаете. Это может быть вызвано невидимым или легко пропущенным содержимым, таким как пробелы или даже управляющие символы.
  4. Вы проверяете базу данных в транзакции, которая создала данные, или в сеансе, который допускает грязное чтение, и вставку, которая создала данные еще не совершено.
...