在Hibernate中执行Criteria查询后,是否需要提交/关闭会话?

时间:2012-10-12 16:32:01

标签: java hibernate session orm criteria

我的代码如下:

Session session = MySessionFactory.createSession();
session.beginTransaction();
Criteria cq = session.createCriteria(clazz);
// Do stuff.
List list = cq.list();
session.getTransaction().commit();
session.close();

我真的需要beginTransaction(),commit()和close()吗?

我在JPA中听到,CriteriaQuery(与Criteria相对)不需要主动事务管理。

2 个答案:

答案 0 :(得分:1)

是的,您需要会话管理。但是,您可以在单个事务/会话中执行多个操作/查询。我建议从每个请求(如果您正在创建Web服务器),作业等单个事务开始,并根据需要增加事务的粒度。

如果你想避免使用Spring,那么仍然可以通过各方面轻松完成这些工作,但是你很快就会重复很多春天所做的工作。

答案 1 :(得分:0)

>我在JPA中听到,CriteriaQuery(与Criteria相对)不需要主动事务管理。

这是正确的。

如果您将代码更改为标准JPA,则不会强制在事务中运行查询 - 前提是您正在选择实体(而不是INSERTING / UPDATING / DELETING)并且未在查询上设置LockMode。

如果这是所需的JPQL:

SELECT c
FROM Customer c JOIN c.orders o JOIN o.lineItems i
WHERE i.product.productType = 'printer'

Stardard JPA Criteria查询代码为:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> customer = cq.from(Customer.class);
Join<Customer, Order> order = customer.join(Customer_.orders); // or .join("orders")
Join<Order, Item> item = order.join(Order_.lineItems);         // or .join("lineItems")

ParameterExpression<String> p = cb.parameter(String.class, "prodType");
cq.select(customer)
  .where(cb.equal(item.get(Item_.product).get(Product_.productType), p));
// if you haven't generated JPA metamodel Customer_, Product_, etc, 
// can replace this with 
//  .where(cb.equal(item.get("product").get("productType"), p));


TypedQuery<Employee> tq = em.createQuery(cq);
q.setParameter("prodType", "printer");
return q.getResultList();

它有点难看,但它是强类型的(JPQL不是),标准的,面向对象的,在初始化时编译,因此速度很快。 : - )