Я пытаюсь сохранить объект "Район" в базу данных. Но у этой сущности есть родительское поле «Город». Позвольте мне показать мои занятия, чтобы объяснить лучше.
У меня есть районные и городские классы. В классе District есть много взаимосвязей на поле City. Один город может иметь несколько районов. Я не добавляю эти отношения в класс City, потому что это не нужно знать.
public class District{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(unique=true)
private String name;
@ManyToOne(optional=false, cascade=CascadeType.ALL)
@JoinColumn(name="city_id")
private City city;
//getters and setters
}
public class City{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(unique=true)
private String name;
//getters and setters
}
Когда я хочу сохранить районный объект "Гринвич" впервые, название города которого Лондон. Он сохраняется, потому что такой строки в таблице City еще нет.
Во второй попытке я хочу сохранить второй объект округа "Маленькая Венеция", чье название города снова Лондон, но он выдает ошибку "Дубликат записи", потому что он пытается сохранить объект с тем же названием города.
Если вы заметили, я использую «cascade = CascadeType.ALL» в строке с аннотацией «ManyToOne». Я ожидаю, что hibernate не сохранит объект City, если в таблице City есть такая строка автоматически. Это причина, почему каскад используется, как я знаю. Но он пытается сохранить вслепую и получить ошибку.
Должен ли я сначала выполнить поиск по названию города. Это означает стоимость с моей стороны, потому что я буду делать еще одну операцию выбора в каждой итерации добавления района. Какой стратегии я должен следовать в этом случае? или я что-то неправильно понимаю при использовании JPA?