пружинные данные JPA опционально. неправильно работает - PullRequest
1 голос
/ 14 мая 2019
Country country = countryService.findCountryByName(DEFAULT_COUNTRY_NAME)
                    .orElse(countryService.create(createCountryEntity()));

Служба:

public Optional<Country> findCountryByName(String name) {
        return dao.findByNameIgnoreCase(name);
    }

@Transactional(propagation = Propagation.REQUIRED)
public Country create(Country country) {
    return dao.save(country);
}

Дао:

@Transactional
public interface CountryDao extends JpaRepository<Country, Integer> {
    Optional<Country> findByNameIgnoreCase(String name);
}

Сущность

@Entity
@Table(name = "country")
@Data
public class Country {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "country_id", updatable = false)
    @JsonIgnore
    private int id;

    @Column(name = "country_name")
    @NotNull
    @Size(min = 4, max = 100)
    private String name;
}

Я не знаю, почему countryService.findCountryByName(DEFAULT_COUNTRY_NAME) .orElse(countryService.create(createCountryEntity())); всегда идетв блок orElse, даже если я убедился, что первая часть присутствует в отладчике.

Как это исправить?

1 Ответ

1 голос
/ 15 мая 2019

Я не знаю, почему [...] всегда входит в блок orElse, даже если я убедился, что первая часть присутствует

Так работает Java. orElse это просто метод, а не условие if или что-то в этом роде. Поэтому его параметры будут оценены перед вызовом.

Вы, вероятно, хотите что-то вроде

Country country = countryService
        .findCountryByName(DEFAULT_COUNTRY_NAME)
        .orElseGet(() -> countryService.create(createCountryEntity()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...