при сохранение сущности получаю Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity

Java 17 Spring + Hibernate

Имеется две сущности

@Entity
public class Quest {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;

    @ManyToOne
    @JoinColumn(nullable = false)
    private Country country;

}
    
@Entity
public class Country {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String name;
}

Сохранение сущностей раздельно делаю для того чтобы перед этим выполнить проверки сущности Country и возможно изменить сущность Quest. Вот класс сервиса, в котором выполняется сохранение сущностей. Первой сохраняю сущность Country, чтобы таблице country уже была создана соответсвующая запись.

@Service
@RequiredArgsConstructor
public class QuestServiceImpl implements QuestService {

    private final QuestRepository questRepository;

    private final CountryService countryService;

    @Override
    @Transactional
    public Quest save(Quest quest) {
    
        var country = quest.getCountry().getName();
        // Тут выполняются проверки перед сохранением
        countryService.save(getCountry(country));
        return questRepository.save(quest);
    }

    Country getCountry(String name) {
     ...
        return country;
    }
}

@Service
@RequiredArgsConstructor
public class CountryServiceImpl implements CountryService {

    private final CountryRepository countryRepository;

    @Override
    @Transactional
    public Country save(Country country) {
        return countryRepository.save(country);
    }

}

В результате получаю ошибку

HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.

Я так понимаю, что проблема в том, что весь код выполняется в пределах одной транзакции. Но у меня же метод CountryServiceImpl#save помечен тоже как @Transactional. Как мне это исправить?

Если я убираю @Transactional in CountryServiceImpl , то все равно получаю ту же ошибку. Но в этом случае данные в таблицу Country записываются. Но в таблицу Quest все равно не пишутся. Тоже самое происходит, если я убираю @Transactional в обоих сервисах.


Ответы (0 шт):