当前位置: 首页 > 知识库问答 >
问题:

HiberNate 5.2中SharedSessionContract.create标准(类持久类)的正确替代方案

晋俊贤
2023-03-14

我正在从Hibernate 3.x升级到最新的Hibernate 5.2.0 FINAL。在我的旧代码中,我们使用了如下的条件查询。

Session session =getHibernateTemplate().getSessionFactory().getCurrentSession();
Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("Department", department));
return criteria.list();

现在,从HiberNate 5.2.0开始,createCrit的()方法已经被弃用了,可以从下面的留档中找到。

https://docs . JBoss . org/hibernate/ORM/5.2/javadocs/deprecated-list . html https://docs . JBoss . org/hibernate/ORM/5.2/javadocs/org/hibernate/sharedsessioncontract . html # create criteria-Java . lang . class-

文档建议使用JPA标准。以下是我基于上述背景提出的几个问题。

>

  • 由于我们没有使用EntityManager并且严重依赖HibernateDAO的支持和Hibernate模板,我如何使用会话或会话工厂使用JAP标准?

    如果我在下面的代码片段中使用DetachedCriteria,它会和以前的实现一样吗?或者下面的代码会给出与会话无关的结果吗?

    DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class);
    criteria.add(Restrictions.eq("Department", department));
    return (List<Employee>) getHibernateTemplate().findByCriteria(criteria);
    

    同样作为替代方案,如果我以下面提到的方式使用 DetachedCriteria,它是否会产生与我的旧代码相同的影响。

    Session session  =getHibernateTemplate().getSessionFactory().getCurrentSession();
    DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class);
    criteria.add(Restrictions.eq("Department", department));
    return criteria .getExecutableCriteria(session).list();
    

    如果有更好的方法来处理这个问题,请提出建议,因为我不想改变HibernateDAOSupport和HibernateTemplate的用法。

  • 共有3个答案

    淳于祺
    2023-03-14

    在Hibernate5.2中,org.hibernate.会话实现了javax.persistence.EntityManager,因此您可以直接使用会话创建条件查询。请参阅JPA-标准API。

    但hibernate 5.2.1.Final中可能存在bug,如果调用JPA Criteria API < code > typed Query # get result list ,改为调用< code>Query#list(),则< code>setCacheable不起作用。

    public <T> T getAll(Class<T> clazz, boolean cache){
        CriteriaQuery<T> query = getCurrentSession().getCriteriaBuilder().createQuery(clazz);
        query.select(query.from(clazz));
        Query<T> q = getCurrentSession().createQuery(query);  // CriteriaQueryTypeQueryAdapter instance
        q.setCacheable(cache); // execute AbstractProducedQuery#setCacheable
    //    return q.getResultList(); // CriteriaQueryTypeQueryAdapter#getResultList(), cache not works
        return q.list(); // AbstractProducedQuery#list() cache may be enabled
    }
    
    谢鸿飞
    2023-03-14

    文档链接之后是状态:

    旧的Hibernate org . Hibernate . criteria API,应视为已弃用

    因此,只要切换到DetachedCriteria就可以摆脱当前的贬值,但它建议使用JPA Criteria(它不支持org.hhibernate.criterian.Restrictions等)。目前还不清楚,路线图也帮不了什么忙。

    它确实提到:

    “最终,Hibernate特定的标准特性将作为JPA javax.persistence.crimination.CriteriaQuery的扩展进行移植

    你对此有进一步了解吗?

    唐钊
    2023-03-14

    使用标准生成器,如下所述:

    //Use below imports:
    import javax.persistence.criteria.CriteriaBuilder;
    import javax.persistence.criteria.CriteriaQuery;
    import javax.persistence.criteria.Root;
    
    //creating session. This you can create in your own way.
    Configuration cfg = new Configuration();
    cfg.configure("hibernate.cfg.xml");
    cfg.addAnnotatedClass(Employee.class);
    
    SessionFactory factory = cfg.buildSessionFactory();
    Session session = factory.openSession();
    
    //**creating CriteriaBuilder**
    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class);
    Root<Employee> employeeRoot=criteria.from(Employee.class);
    criteria.select(employeeRoot);
    
    //**Adding where clause**
    criteria.where(builder.equal(employeeRoot.get("employeeId"), "E01"));
    List<Employee> employeeList=session.createQuery(criteria).getResultList();
    
     类似资料:
    • 逻辑很简单: 创建一个演员并发送一系列事件。 根据测试停止使用Akka.actor.kill或Akka.actor.poisonkill的演员。 再次启动执行元并测试它是否已正确恢复。 我正在将它迁移到Akka2.6和“AKKA键入”,但Kill和PoisonKill不可用。

    • 随着Hibernate 5.2.2中Criteria类中createCriteria()的弃用,它的许多相关函数无法再使用。我找到了标准的另一种用法。createAlias(String,String)和从以下链接添加限制在Hibernate 5中弃用了createCriteria方法,但我找不到如何在JPA criteria中替换criteria中可用的以下函数: 请给我提供一种使用JPA标准A

    • 除了Hazelcast之外,任何有Vertx群集管理器实际经验的人都对我们的以下要求有什么建议? 对于我们的(实时传感器数据)系统,我们在多个JVM中有数百个垂直链接,但我们不需要或不希望eventbus跨多个物理服务器。 我们在多个服务器上运行Vertx,但如果我们不在所有服务器之间共享一个eventbus,那么我们的平台就不那么复杂了(我们更愿意明确说明在服务器之间传递消息)。 Hazelca

    • 持久化类(Persistent Object )简称 PO,在 Hibernate 中, PO 是由 POJO(即 java 类或实体类)和 hbm 映射配置组成。 简单点说,持久化类本质上就是一个与数据库表建立了映射关系的普通 Java 类(实体类),例如 User 类与数据库中 user 表通过映射文件 User.hbm.xml 建立了映射关系,此时 User 就是一个持久化类。 持久化类的规

    • 到现在我们已经实现了我们那点唱机的一部分代码,我们看到了数组,哈希,方法,但我们还没有涉及到Ruby中其他的数据类型:数字,字符串,范围(ranges),正则表达式。下面我们就要花些时间来看看这些类型。 数字型Ruby 支持整型和浮点型两种数字类型。整型可以是任意长度(最大值由你机器的内存大小决定)。在一定范围内(通常是-230 to 230-1 or -262 to 262-1)在内部由二进制方

    • Hibernate的整个概念是从Java类属性中获取值并将它们保存到数据库表中。 映射文档帮助Hibernate确定如何从类中提取值并使用表和关联字段映射它们。 其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类。 如果这些类遵循一些简单的规则(也称为Plain Old Java Object (POJO)编程模型),Hibernate的效果最佳。 持久化类有以下主要规则