JPA @ManyToMany только с одной стороны? - PullRequest
5 голосов
/ 10 мая 2010

Я пытаюсь обновить отношение @ManyToMany, но вместо этого оно очищается ...

Мой класс Project выглядит так:

@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 Ответ

2 голосов
/ 10 мая 2010

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

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

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

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

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

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

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