首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate 5.2使用

Hibernate 5.2使用
EN

Stack Overflow用户
提问于 2018-04-11 19:57:34
回答 2查看 132关注 0票数 0

在Java方面,似乎有几种不同的使用Hibernate的方法,很难找到哪种方法符合最佳实践和/或最新的方法。我不喜欢直接使用实际的SQL语句,而是更愿意使用下面的方法,但是如果下面的代码不是最佳实践方法,那么我愿意使用下面的方法。

所以:

  1. 从5.2开始,按照下面的代码样式,当前的方法是什么?我想我已经看到了EntityManager代替了Session,是其中一种比另一种更流行,还是它们都可以继续前进?
  2. 与实际SQL语句相比,下面的方法更可取吗?

我意识到这可能不是最好的措辞,所以如果需要澄清,请告诉我。

代码语言:javascript
运行
复制
    public List findAllRoles() {
    try (Session session = getSessionFactory().openSession()) {
        session.beginTransaction();
        CriteriaBuilder builder = session.getCriteriaBuilder();
        CriteriaQuery<AuthRole> criteria = builder.createQuery(AuthRole.class);
        Root<AuthRole> root = criteria.from(AuthRole.class);
        criteria.select(root);
        List<AuthRole> roleList = session.createQuery(criteria).getResultList();
        session.getTransaction().commit();

        return roleList;
    }
}

会议来自:

代码语言:javascript
运行
复制
    private static final SessionFactory SESSION_FACTORY = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
    try {
        return new MetadataSources(registry).buildMetadata().buildSessionFactory();
    } catch (Exception e) {
        StandardServiceRegistryBuilder.destroy(registry);
        LOG.error(e, e);
        return null;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-04-11 20:09:51

这两者都是可以接受的,参见Guide.html (官方指南),它从一个很好的概述开始。EntityManager是JPA接口,会话是本机接口。JPA是可移植的,所以如果使用它,您可以选择从Hibernate切换到另一个实现,而无需更改代码。为了以防万一,我会在新代码中这样做。带有会话的本机API可以提供JPA中没有的Hibernate特定特性,而且如果您正在使用为Hibernate构建的现有代码,那么它是很好的。

至于标准与SQL或HQL (或带有JPA的JPA),您可能需要全部。就我个人而言,我发现HQL比标准更强大、更容易阅读。两者都具有不直接绑定到数据库的优点,因此在可能的情况下使用标准或HQL代替SQL。但是,在某些情况下,您可能需要SQL以获得更好的性能。实用主义者获胜。

票数 0
EN

Stack Overflow用户

发布于 2018-04-11 20:12:48

我想我已经看到了使用EntityManager而不是会话,其中一个比另一个更流行,还是它们都可以继续前进?

EntityManager是标准的JPA。对于专有的API,没有什么是您不能用标准API做的。如果确实需要,您可以从SessionFactory或EntityManager中获得一个EntityManager或会话。因此,应该首选标准API。它具有较少的遗留负担,并且可以跨JPA实现进行移植。

与实际SQL语句相比,下面的方法更可取吗?

使用JPA查询数据库有三种标准方法: JPQL、条件API和SQL。

一般而言,应优先考虑JPQL (IMHO)。标准API的可读性和简单性要高得多。它比SQL更简洁,并且使用逻辑实体模型,而不是物理底层关系模型。

当JPQL不够强大时,SQL有时是必要的。

标准API是不直观的,它产生的代码很难阅读和理解。当您需要动态地生成查询时,应该限制它的使用,根据各种.标准(因此得名)。

请注意,还有其他一些非标准的方法来生成动态查询(如QueryDSL),并且也可以通过使用spring存储库(以及spring或CDI来简化事务管理)来避免许多查询和样板代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49783520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档