2010-05-10 2 views
3

Я пытаюсь обновить @ManyToMany связь, но она очищается вместо ...JPA @ManyToMany только с одной стороны?

Мой класс проекта выглядит следующим образом:

@Entity 
public class Project { 
    ... 
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "PROJECT_USER", 
    joinColumns = @JoinColumn(name = "PROJECT_ID", referencedColumnName = "ID"), 
    inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID")) 
    private Collection<User> users; 
    ... 
} 

Но у меня нет - и я не хочу - сбор проектов в объекте пользователя.

Когда я смотрю на сгенерированные таблицы базы данных, они выглядят хорошо. Они содержат все столбцы и ограничения (первичные/внешние ключи).

Но когда я сохраняю проект, у которого есть список пользователей (и пользователи все еще находятся в базе данных), таблица сопоставления не обновляется обновляется, но когда я обновляю проект после этого, список Пользователи очищаются.

Для лучшего понимания:

Project project = ...; // new project with users that are available in the db 
System.out.println(project getUsers().size()); // prints 5 
em.persist(project); 
System.out.println(project getUsers().size()); // prints 5 
em.refresh(project); 
System.out.println(project getUsers().size()); // prints 0 

Итак, как я могу обновить отношения между Пользователем и проекта?

ответ

1

ошибка, кажется, в коде, который вы оставили с ...

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

Здесь, похоже, есть какая-то путаница в отношении разницы между JDBC и ORM и тем, что делает EntityManager. em.persist не является вставкой SQL или SQL-обновлением. В нем говорится: «Возьмите этот новый объект и поставьте его в управляемое состояние». Обычно это приводит к вставке SQL, но это не то, что это означает на уровне приложения.

Похоже, вы по сути говорите в спящем режиме. «Я внесла некоторые изменения в это, в следующий раз, когда сеанс синхронизирован, пожалуйста, продолжайте их, о, вы знаете, что, я передумал, вернусь к тому, что находится в базе данных. " em.persist напрямую не помещает ничего в базу данных, что, вероятно, все еще «ничего».

Попробуйте подбросить em.flush перед обновлением, и вы должны увидеть своих пользователей.

(Вы ничего о том, как ваш сеанс настройки или как вы управляете сделки не сказал, поэтому я предполагаю, что все это в одной транзакции.)

+0

... спасибо em.flush () сделал трюк! –

+0

Любопытно, какова функциональность, которую вы пытаетесь достичь? Экспериментировать с этим - интересное научное исследование того, как работает ORM, но я не знаю, почему вы на самом деле хотите это сделать. – Affe

+0

для UnitTesting ... –

Смежные вопросы