Сохраните дочернюю сущность и управляйте ее родительской сущностью соответственно, но это дает ошибку: повторяющаяся запись для ключевой ошибки - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь сохранить объект "Район" в базу данных. Но у этой сущности есть родительское поле «Город». Позвольте мне показать мои занятия, чтобы объяснить лучше.

У меня есть районные и городские классы. В классе 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...