при сохранение сущности получаю 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 в обоих сервисах.