Как сослаться на экземпляр, уже сохраненный в базе данных? - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь смоделировать весной отношения между фильмами и актерами. Здесь у нас есть два моих класса:

@Entity
public class Movie {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String genre;
    private String year;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private List<Actor> actors;

// getters and setters
@Entity
public class Actor {

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

// getters and setters

Я определил однонаправленное отношение «многие ко многим», и оно работает хорошо, но не в следующем случае. Если я вставляю новый фильм с новыми актерами, которых еще нет в базе данных, это работает хорошо, все таблицы корректно обновляются. Но если я хочу вставить новый фильм с уже сохраненным актером, я не хочу сохранять дважды, я хочу, чтобы таблица отношений ссылалась на уже сохраненного актера, а в таблице актеров новый актер не добавлялся.

Следующий JSON - это тот, который отправляется конечной точке для создания нового фильма:

{
  "actors": [
    {
      "age": "string",
      "dni": "string",
      "name": "string",
      "surname": "string"
    }
  ],
  "genre": "string",
  "title": "string",
  "year": "string"
}

Итак, как я могу вставить фильм с актером, уже находящимся в базе данных, чтобы на него ссылались? Потому что, если я вставляю новый с точно такими же данными, я сохраняю этого актера дважды, и в случае повторения идентификатора я получаю уникальный индекс или нарушение первичного ключа.

Большое спасибо за вашепомощь!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

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

 @Autowired
 ActorRepository actorRepository;

 Optional<Actor> actorOptional = actorRepository.findById(id);
 if(actorOptional.isPresent()){
     movie.getActors().add(actorOptional.get());
 }else{
   // create new actor and add it to the list
 }
0 голосов
/ 30 сентября 2019

если у вас есть идентификатор объекта [@Id] с обеих сторон, вы можете использовать session.saveOrUpdate

Из документов Hibernate:

saveOrUpdate() делает следующее:

  • , если объект уже является постоянным в этом сеансе, ничего не делать
  • , если другой объект, связанный с сеансом, имеет такой же идентификатор, выдать исключение
  • если объект не имеет свойства идентификатора, save() it
  • , если у идентификатора объекта есть значение, присвоенное вновь созданному объекту, save() it
  • , если объектверсионируется с помощью <version> или <timestamp>, а значение свойства version является тем же значением, присвоенным вновь созданному объекту, save() it
  • в противном случае update() объект
...