Отображение Hibernate «многие ко многим» с существующими значениями - PullRequest
1 голос
/ 08 апреля 2011

Использование JPA2 и Hibernate

У меня есть два класса, которые взаимосвязаны в исходных данных,

Класс человека:

@Entity
public class Person {
    @Id @Column("PERSON_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    private String job;
    // getters & setters
}

И класс Кино:

@Entity
public class Movie {
    @Id @Column("MOVIE_ID")
    private long id;
    private String movieName;
    private String rating;
    @ManyToMany
    @JoinTable(name = "Movie_Actor",
      joinColumns = @JoinColumn(name="Movie_ID"),
      inverseJoinColumns = @JoinColumn(name="Person_ID")
    )
    private Set<Person> actors = new HashSet<Person>();
    // getters & setters
}

Актер - это экземпляр Person с заданием = "Актер". Я планирую добавить авторов, режиссеров и т. Д. Позже, когда это сработает. Первоначально объект Actor может иметь или не иметь идентификатор (при условии, что в дальнейшем мы будем читать из базы данных и заполнить PERSON_ID).

Актеры добавлены в класс Movie:

Person actor = new Person();
actor.setId=0;
actor.setName="Actor Name";
actor.setJob="Actor";
movie.addActor(actor);

From Movie.java
public void addActor(Person actor) {
    actors.add(actor);
}

В настоящее время у меня работает код, который будет вставлять объекты Person (актеры) и Movie в базу данных (при условии, что они в данный момент не существуют).

Я хотел бы обновить объект Person после обогащения его данными из других источников (например, цитаты / рисунки), сохранить его в базе данных session.save(actor) (который создает PERSON_ID, а затем сохранить Movie объект.

Проблема в том, что когда я обновляю объект Movie обновленным Person (включая идентификатор), тогда я получаю уникальную ошибку ограничения для базы данных (поскольку Person уже существует).

Как сохранить объект Movie с этими предварительно созданными Person объектами, которые могут иметь или не иметь отношения?

<ч /> РЕДАКТИРОВАТЬ: Согласно предложению Томаса, я изменил session.save на session.saveOrUpdate, что решает проблему уникальной константы.

1 Ответ

2 голосов
/ 09 апреля 2011

Просто, чтобы подвести итог того, что, по-моему, вы делаете и почему saveOrUpdate исправляет эту проблему:

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

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

Таким образом, обновление с использованием save приведет к двум наборам данных с одинаковым идентификатором и, следовательно, к нарушению ограничения уникального ключа.

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