【发布时间】:2013-11-25 11:46:58
【问题描述】:
我有什么:
我在我的应用程序中集成了状态模式。这意味着当我改变某个实体的状态时,它可能会引起连锁反应。表示相关实体的状态也可能发生变化,而相关实体的状态也可能会改变,以此类推。
我还使用 Hibernate 对话,这意味着我使用 MANUL 刷新模式。
public void handler() {
session = beginHibernateConversation(); //open new transaction and new session (if it's needed)
entity.changeState(session); //call chain reaction
finishhibernateConversation(session); //manual flush, commit, and if it's needed - close session
}
什么问题:
当我使用手动刷新模式时,仅在 finishhibernateConversation(session) 方法上对 DB 进行所有更改。
我需要在changeState(session) 方法中使用session.createQuery 方法。但我看不到实际的实体状态!因为所有更改都存储在未刷新的会话中,而且session.createQuery 与会话上下文无关。
问题:
如何让session.createQuery考虑session cache?
一个小例子:
例如我有Person - Job 关系(one-to-many)。当我将一项工作的状态更改为 full time 时,我需要更新所有其他相关工作(因为人们只能从事一份全职工作)。
所以,我愿意(在人员更新请求内部)
job1.changeState('full time')- [第一种方法内]
session.createQuery("from Job where person.id = (:id) state in (:states)")。
问题是第二个查询不正确,因为它没有考虑job1已经改变的状态
【问题讨论】: