我在没有春天的情况下使用hibernate 3.2.7(不要问,客户端不支持弹簧)我遇到了开放会话实施的问题 - 视图模式。当我通过调用save()将对象持久化到数据库时,然后在该对象上调用get()以加载由数据库中的外键表示的子对象的详细信息。问题是,当我调用get()时,没有任何子对象被加载。如果我从新事务中调用get()方法,则所有内容都按预期加载。
这是我的请求过滤器的一个片段,用于打开会话并创建事务:
HibernateUtil.openSession();
//get a transaction from JTA
transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
transaction.begin();
// Call the next filter (continue request processing)
chain.doFilter(request, response);
// Commit and cleanup
log.finer("Committing the database transaction");
transaction.commit();
以下是来自服务层的保存方法的片段,用于保存事务:
session.setFlushMode(FlushMode.MANUAL);
contract.save();
//save the update to the database
session.flush();
在持久化对象之后,请求将传递给struts操作类,该类调用服务中的get()方法,该方法具有此代码以加载合同:
Session session = HibernateUtil.getSession();
session.setFlushMode(FlushMode.MANUAL);
try {
contract = contract.get();
...
}
在加载持久合同时调用相同的get动作方法,该方法工作正常,因此我知道get()方法在其自己的事务中被隔离时正常工作。它唯一不起作用的是它在同一事务中从save()之后调用它。
答案 0 :(得分:4)
你试过对对象做一个Session.refresh()吗?