3

我正在研究 Hibernate(3.3.2.GA - 并且由于该软件应该很快发布,所以没有时间更新)应用程序的继承代码库,我正在尝试从数据库中删除一些对象。通过 HQL 查询删除对象后,仍然可以通过(MyEclipse 生成的)dao 的 findById 方法从休眠会话中检索对象。为了让对象消失,我有什么遗漏吗?我需要使一些缓存无效吗?在等待看似随机的一段时间(大约 30 到 300 秒之间)后,findById 开始返回 null。对象使用复合 ID。这可能是个问题吗?

这是删除对象的代码:

Query query = objDao.getSession()
            .createQuery("DELETE FROM Obj i WHERE i.id.uuid = ? AND i.userId = ?");
query.setString(0, obj.getUuid());
query.setInteger(1, currentUserId);
objDao.getSession().beginTransaction();

int numRows = query.executeUpdate();
System.out.println("Deleted " + numRows + " Obj for uuid " + obj.getUuid() + " (user: "
            + currentUserId+ ")");
objDao.getSession().flush();
objDao.getSession().getTransaction().commit();

这是之后调用以从数据库中检索对象的代码。我希望这会返回 null 但事实并非如此。

objDao.findById(new ObjectId(temp.getId(), temp.getUuid()))

objDao.findById 是这样实现的:

public Obj findById(com.application.ObjectId id) {
    Obj instance = (Obj) getSession() // this returns a org.hibernate.Session
    .get("com.application.Obj", id);
    return instance;
}

任何帮助表示赞赏!

4

1 回答 1

0

不确定您是如何获得会话的,但建议您执行以下操作:

getSessionFactory().openSession();

这样,您将始终获得一个新会话,并且不会返回先前会话中缓存的任何内容。

干杯!!

于 2013-09-04T19:51:14.593 回答