Java Hibernate在同一事务中对新创建的记录在save()之后调用get()

Java Hibernate在同一事务中对新创建的记录在save()之后调用get(),java,hibernate,Java,Hibernate,我使用的hibernate 3.2.7没有spring(不问,客户端不支持spring),我在视图模式中实现开放会话时遇到了问题。当我通过调用save()将一个对象持久化到数据库中时,我会对该对象调用get(),以加载由数据库中的外键表示的子对象的详细信息。问题是,当我调用get()时,没有任何子对象被加载。如果我从一个新事务调用get()方法,所有内容都会按预期加载 这是我的请求筛选器中的一个片段,用于打开会话并创建事务: HibernateUtil.openSession(); //get

我使用的hibernate 3.2.7没有spring(不问,客户端不支持spring),我在视图模式中实现开放会话时遇到了问题。当我通过调用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();
下面是保存事务的服务层save方法的一个片段:

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 action方法,该方法工作正常,因此我知道get()方法在其自身事务中隔离时会正常工作。它唯一不起作用的时候是在同一事务中的save()之后调用它。

您是否尝试过对对象执行Session.refresh()?

是的,refresh是关键!谢谢