好吧,我正在使用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();
}
...
@ManagedBean
@RequestScoped
public class BookBean implements Serializable
{
...
答案 0 :(得分:0)
这种情况发生在你身上很奇怪。 COUNT应该有效。
尝试调试代码,并验证每个选择执行中的参数是否始终相同。
PS:在Hibernate上有一个封闭的问题,发生了类似的事情,但是在不同的环境中: https://hibernate.atlassian.net/browse/HHH-2945