Hibernate 的Session flush设计是否有问题?
m99c 2005-04-27 10:03:40 1。在session1中加载一persistent object(比如订单对象Order),然后修改此persistent object,再session1调用flush把更改的数据发送到数据库。
2。在session2加载上面的对象,此时得到的是上面已更改的对象。
3。在session1打开的transaction 调用rollback,此时数据库又恢复成原来的对象。但session2得到的数据是不同步的,可能会引起很多问题。
请问flush设计是否有问题?有没有其他方法可以避免?
下面是我的Junit test代码,测试是通过的。
public void testFlush() {
Session sess1 = openSession();
//Load a sales order from session1
SalesOrder order1 = null;
Criteria q = sess1.createCriteria(SalesOrder.class);
q.setFirstResult(0);
q.setMaxResults(1);
List orders = q.list();
for (Iterator iter = orders.iterator(); iter.hasNext();) {
order1 = (SalesOrder) iter.next();
}
//Modify sales order's buyer
String oldBuyer = order1.getBuyer();
String newBuyer = "vvv";
order1.setBuyer(newBuyer);
//Flush session1,send sql statement to database
Transaction transaction = sess1.beginTransaction();
sess1.flush();
//Open session2 to load current sales order
Session sess2 = openSession();
SalesOrder order2 = (SalesOrder) sess2.load(SalesOrder.class, order1
.getId());
assertEquals(order2.getBuyer(), newBuyer);
//order is changed in database
sess2.close();
//Roll back,lose all change.
transaction.rollback();
sess1.close();
Session sess3 = openSession();
SalesOrder order3 = (SalesOrder) sess3.load(SalesOrder.class, order1
.getId());
assertEquals(order3.getBuyer(), oldBuyer);
}