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

Java 在Hibernate中执行条件查询后,是否需要提交/关闭会话?,java,hibernate,session,orm,criteria,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()、co

我有一个如下代码:

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(与CriteriaQuery相反)不需要活动事务管理。

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

如果您想避免使用Spring,那么使用方面仍然可以很容易地做到这一点,但是您很快就会重复Spring所做的大量工作。

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

没错

如果您将代码更改为标准JPA,则不会强制在事务中运行任何查询-前提是您正在选择实体(而不是插入/更新/删除),并且没有在查询上设置锁定模式

如果这是所需的JPQL:

SELECT c
FROM Customer c JOIN c.orders o JOIN o.lineItems i
WHERE i.product.productType = 'printer'
标准JPA标准查询代码为:

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();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Customer.class);
Root customer=cq.from(customer.class);
加入订单=客户。加入(客户订单);//或加入(“订单”)
Join item=order.Join(order..lineItems);//或.连接(“行项目”)
ParameterExpression p=cb.parameter(String.class,“prodType”);
cq.选择(客户)
其中(cb.equal(item.get(item.product).get(product.productType),p));
//如果您尚未生成JPA元模型Customer、Product等,
//可以用
//其中(cb.equal(item.get(“产品”).get(“产品类型”),p));
TypedQuery tq=em.createQuery(cq);
q、 设置参数(“prodType”、“打印机”);
返回q.getResultList();
这有点难看,但它是强类型的(JPQL不是),标准的,面向对象的,在初始化时编译,因此速度很快。
:-)

Per,事务从来都不是可选的。您应该在事务内部完成所有工作,并在最后提交。谢谢。当我看到所有这些示例都带有不显示代码会话部分的条件时,我感到很困惑。这可能是因为该部分是标准样板文件,并且是隐含的。@SomeNewbie:使用Spring及其声明性会话和事务管理,您将永远不必打开和关闭会话,以及明确地开始和结束事务。@SomeNewbie:选择其中任何一个,但一定要使用允许声明性事务和会话管理的东西。