外部サービスに接続して新しい SMS を取得するアプリケーションを開発しています。これらのメッセージは、Hibernate によってローカル データベースに保存されます。私のクライアントは、時間、数などの多数のパラメーターに基づいてこれらのメッセージを検索できます。
「List1」というパラメーターのリストを使用して検索メソッドを呼び出した後、問題なく目的の結果が得られます。この結果を待っている間に、新しいメッセージが届きました。
その後すぐに、同じパラメーター リストを使用して検索メソッドを再度呼び出し、新しいメッセージも取得することを期待していますが、以前の結果が得られます。
データベースを確認したところ、新しいメッセージが存在するため、考えられるのは Hibernate キャッシュだけです。どちらのクエリもまったく同じなので、hibernate は以前と同じ結果セットを返すと思います。
私の仮定が正しい場合、どうすればこの問題を克服できますか? そうでない場合、正確に何が起こっているのですか?
編集
ここに私のソースコードの関連部分があります。クライアントが検索リクエストを開始すると、次の 2 つのメソッドが呼び出されます。
smsService.refresh();
JSONArray result = smsService.retrieveMessages(...);
@Transactional
public JSONArray retrieveMessages(Long periodBegining, Long periodEnd, String order, Integer limit, String profile, Boolean unread, String correspondent) {
List<ShortMessage> messageList = shortMessageDAO.find(beginDate, endDate, order, limit, profile, unread, correspondent);
JSONArray result = new JSONArray();
for (ShortMessage message : messageList)
result.put(message.toJSON());
shortMessageDAO.markRead(messageList);
return result;
}
@Transactional
public void refresh() {
webService.authentication(serviceUsername, servicePassword);
while(webService.hasUnread() > 0) {
SMS sms = webService.retrieveMessage();
ShortMessage message = new ShortMessage(sms.getHash(), sms.getFrom(), sms.getTo(), "DEFAULT", sms.getMessage(), new Date(sms.getTime()), true);
shortMessageDAO.insert(message);
}
}
}
public List<ShortMessage> find(Date beginDate, Date endDate, String order, Integer limit, String profile, Boolean unread, String correspondent) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ShortMessage.class);
criteria.add(Restrictions.ge("time", beginDate));
criteria.add(Restrictions.le("time", endDate));
criteria.add(Restrictions.eq("profile", profile));
if (unread)
criteria.add(Restrictions.eq("unread", true));
if (correspondent != null)
criteria.add(Restrictions.eq("origin", correspondent));
criteria.addOrder(order.equals("ASC") ? Order.asc("time") : Order.desc("time"));
criteria.setMaxResults(limit);
criteria.setCacheMode(CacheMode.IGNORE);
return (ArrayList<ShortMessage>) criteria.list();
}