2013-03-13 4 views
2

У меня есть очень простой отношения многие ко многим: человек и проектов, созданных следующим образом:Как настроить базовые отношения с японским JPA/Hibernate?

лицо:

@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "person_project", 
joinColumns = @JoinColumn(name = "Person_Id"), 
inverseJoinColumns = @JoinColumn(name = "Project_id")) 
private Set<Project> projects = new HashSet<Project>(); 

проекта:

@ManyToMany 
@JoinTable(name = "person_project", 
joinColumns = @JoinColumn(name = "Project_Id"), 
inverseJoinColumns = @JoinColumn(name = "Person_id")) 
private Set<Person> persons = new HashSet<Person>(); 

При обновлении Person, новые проекты могут быть указаны. У меня есть JPARepository, настроенный для Person, и я использую saveAndFlush (...), чтобы сохранить новые проекты с Person.

Это работает для одного человека. Если я добавлю новый проект, он будет правильно сохранен с Лицом и таблицами в обновлении базы данных. Однако, если я затем добавлю тот же проект для другого лица, он будет удален из первого лица! Идентификатор первого лица заменяется идентификатором второго лица в таблице соединений.

В чем причина этого? неверно ли моя установка ссылок?

ответ

3

Вы не используете одну и ту же аннотацию на обеих половинах отображения. Первая часть определяет таблицы и столбцы объединения. Вторая половина отображения должна знать только имя другой половины (проекты в вашем случае), она получит детали из первой аннотации. Для достойного объяснения см .: Hibernate Many to Many Mapping

+0

Интересно. Я получил идею из примеров Pro Spring 3 Book, где это действительно было сделано таким же образом: одно и то же отображение с обеих сторон только с заменой столбцов. Я не могу найти аналогичный пример в Интернете, но я нашел несколько страниц, в которых упоминается, что «mappedBy» необходим для двунаправленных отношений и что однонаправленные отношения не будут содержать аннотаций на обратной стороне. Я немного смущен. – wannabeartist

0

Похоже, изменение проекта следующим образом исправляет проблему:

@ManyToMany(mappedBy="projects") 
private Set<Person> persons = new HashSet<Person>(); 

Теперь, когда я добавить тот же проект второго человека, то первый из них будет по-прежнему связан с этим проектом, как это должно быть.

Я до сих пор не знаю, почему это работает, поэтому, если кто-то может объяснить это, пожалуйста, сделайте это!

+0

Знаете ли вы, что проблема? Вы можете объяснить? –

+0

Нет, у меня нет лучшего объяснения, чем тот, который дается в ответе @WPrecht – wannabeartist