JPA, Eclipselink, многие-ко-многим: зависимая коллекция не обновляется - PullRequest
2 голосов
/ 05 января 2012

У меня есть одно отношение многие ко многим в моей модели. Есть две организации: Чрезвычайные ситуации и Экипажи (экипажи могут присутствовать во многих аварийных ситуациях и наоборот). Части кода, отвечающие за отношения, выглядят следующим образом:

@JoinTable(name = "CREWS_ON_EMERGENCIES", joinColumns = {
    @JoinColumn(name = "EMERGENCY_ID", referencedColumnName = "EMERGENCY_ID", nullable = false)}, inverseJoinColumns = {
    @JoinColumn(name = "CREW_ID", referencedColumnName = "CREW_ID", nullable = false)})
@ManyToMany(fetch= FetchType.EAGER)
private Collection<Crew> crewList;

и

@ManyToMany(mappedBy="crewList", fetch= FetchType.EAGER)
private Collection<Emergency> emergencyList;

Экипаж является зависимым объектом - emergencyList обновляется, когда я добавляю новую аварийную ситуацию со списком присутствующих экипажей.

На самом деле, база данных обновляется нормально, и новые записи появляются в таблице CREWS_ON_EMERGENCIES сразу после закрытия транзакции. Но если добавить новую аварийную ситуацию, а затем отобразить список всех экипажей и аварийных ситуаций, в которых они участвовали, последняя аварийная ситуация не будет отображаться (очевидно, «emergencyList» устарел). Он появится только при перезапуске сервера (Tomcat) или в режиме отладки.

Код аварийного сохранения ():

 @Transactional
public void save(Emergency e) {
    entityManager.persist(e);
    entityManager.flush();
}

Выбранные экипажи автоматически добавляются в коллекцию crewList Spring MVC.

Кто-нибудь знает, почему это происходит таким образом, и каково решение?

1 Ответ

1 голос
/ 05 января 2012

Я вижу две потенциальные проблемы здесь:

  • ваш код не поддерживает обе стороны двунаправленной ассоциации. Если к аварийной ситуации добавлен экипаж, аварийная ситуация также должна быть добавлена ​​к экипажу (и наоборот). JPA не поддерживает согласованность графов объектов для вас.
  • Если вам нужно перезапустить Tomcat, чтобы увидеть изменения, это означает, что менеджер сущностей никогда не закрывается и не открывается, а его кеш сущностей все еще содержит сущности, которые были загружены в предыдущей транзакции. Должно быть что-то не так с тем, как вы используете менеджер сущностей. Используете ли вы поддержку транзакций и JPA, предлагаемую Spring.

Примечание: когда я вижу, что EAGER используется с обеих сторон ассоциации «многие ко многим», я сразу же думаю: «Это приложение будет очень медленным». Загрузка аварийной ситуации загрузит все ее команды, которая загрузит все их аварийные ситуации, которые загрузят все их команды ... рекурсивно. Вы можете загрузить половину базы данных таким образом.

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