使用HQL选择计数返回不一致的结果

时间:2013-12-16 01:11:17

标签: hibernate jdbc netbeans glassfish

好吧,我正在使用NetBeans 7.2.1,Hibernate 3.2.5,GlassFish 3.1.2.2和MySQL 5.5.20开发JSF 2.1项目。

我在页面上有一个按钮,一旦点击,它就会在表格中添加一个条目。刷新页面后,另一个元素会根据之前是否按下按钮来改变颜色,这是通过在按钮插入条目的表格上通过HQL执行select count(*)来确定的。

我的问题是,select count(*)会在每次刷新时返回不一致的结果。根据我的where子句和表数据,查询应该返回0或总是1,但是它会不断地在每个查询上返回“随机”结果,即使初始插入后数据没有改变

例如,如果我在MySQL Workbench上手动执行我的select count(*)查询,它会在通过页面按钮进行初始插入后返回1,这正是我所期望的。另一方面,Hibernate在每次刷新时随机返回0或1。这是一个例子,每个逗号都是刷新:1,0,1,0,0,1,0,0,0,0,1,0,0,1,1,0

有没有人知道为什么count没有返回一致的结果?它可能是一个缓存问题吗?

如果我在NetBeans中重新启动项目并再次访问同一页面,则它总是按预期返回1.

进一步测试显示该问题似乎与处于“未提交”状态的JDBC连接有关,即使事务本身已成功提交。

如果我的问题不是很清楚,我很抱歉,我自己很困惑。


插入代码:

public boolean reserveBook(int memberId, String isbn)
{
    boolean done = false;

    Transaction tx = null;

    try
    {
        tx = session.beginTransaction();

        Member m = new Member();
        m.setMemberId(memberId);

        Book b = new Book();
        b.setIsbn(isbn);

        Reservation r = new Reservation();
        r.setMember(m);
        r.setBook(b);
        r.setDate(new Date());

        session.save(r);
        tx.commit();

        done = true;
    }
    catch (Exception e)
    {
        if (tx != null)
        {
            tx.rollback();
        }

        e.printStackTrace(System.out);
    }

    return done;
}

计数代码:

public boolean isBookReserved(int memberId, String isbn)
{
    boolean answer = false;

    String reqHQL = "select count(*) " +
                    "from Reservation R " +
                    "where R.member = :memberId and R.book = :isbn";

    try
    {
        session.beginTransaction();
        Query q = session.createQuery(reqHQL);

        q.setParameter("memberId", memberId);
        q.setParameter("isbn", isbn);

        if ((Long) q.uniqueResult() > 0)
        {
            answer = true;
        }
    }
    catch (Exception e)
    {
        e.printStackTrace(System.out);
    }

    return answer;
}

类标题:

public class BookHelper
{
    private Session session;

    public BookHelper()
    {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }
    ...

Bean标头:

@ManagedBean
@RequestScoped
public class BookBean implements Serializable
{
...

1 个答案:

答案 0 :(得分:0)

这种情况发生在你身上很奇怪。 COUNT应该有效。

尝试调试代码,并验证每个选择执行中的参数是否始终相同。

PS:在Hibernate上有一个封闭的问题,发生了类似的事情,但是在不同的环境中: https://hibernate.atlassian.net/browse/HHH-2945