Я использую 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, но мне это не очень нравится. Вы знаете лучший способ сделать это?