Spring + Hibernate: сохранение и выборка данных в соотношении «многие ко многим» - PullRequest
0 голосов
/ 15 февраля 2012

Я использую Spring 3 + Hibernate, и у меня есть две сущности (User, Address), связанные друг с другом отношением @ManyToMany. Каждый объект отображается в таблице («пользователь» и «адрес»), и отношение определяется связываемым таблицей «user_address», который отображает user_id и address_id.

У меня есть «method1», который сохраняет «Пользователь» при добавлении нового адреса:

@Transactional
public void method1 (...) {
   /* do something*/
   user.getAddresses().add(address);
   session.save(user);
}

в другом методе2 Мне нужно получить для конкретного пользователя адрес по улице:

@Transactional
public Address method2 (Long userId, String streetName) {
   String hql = "select distinct a from Address a " +
            "join a.users u " +
            "where u.id=:id and a.name=:name";
            Query query = session.createQuery(hql);
            query.setParameterList("id", userId);
            query.setParameterList("name", streetName);
            Address address = query.uniqueResult();
            return address;
}

Проблема в этой ситуации заключается в том, что при добавлении нового адреса с помощью метода1 он все еще может находиться в кэше, когда метод 2 выполняется (поэтому адрес не возвращается), когда метод 2 обращается к базе данных (что может быть несинхронно). кешировать). Единственное решение, которое я нашел, - это добавить «сброс» после method1, но мне это не очень нравится. Вы знаете лучший способ сделать это?

1 Ответ

0 голосов
/ 15 февраля 2012

Вызов session.flush () вручную в некоторых методах - неплохая идея, по крайней мере для меня.

Есть альтернативы:

  • Установите Hibernate FlushMode на AUTO илиВСЕГДА (сначала попробуйте АВТО, следует предотвратить устаревшие результаты в запросах, ВСЕГДА слишком дорого, чтобы быть полезным)
  • Установите для уровня PROPAGATION значение REQUIRES_NEW в транзакционной аннотации метода 1: всегда будет фиксировать метод 1, приостанавливать текущую транзакцию и создавать новуюодин, чтобы добавить пользователя.
...