在Java方面,似乎有几种不同的使用Hibernate的方法,很难找到哪种方法符合最佳实践和/或最新的方法。我不喜欢直接使用实际的SQL语句,而是更愿意使用下面的方法,但是如果下面的代码不是最佳实践方法,那么我愿意使用下面的方法。
所以:
EntityManager
代替了Session
,是其中一种比另一种更流行,还是它们都可以继续前进?我意识到这可能不是最好的措辞,所以如果需要澄清,请告诉我。
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;
}
}
会议来自:
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;
}
}
发布于 2018-04-11 12:09:51
这两者都是可以接受的,参见Guide.html (官方指南),它从一个很好的概述开始。EntityManager是JPA接口,会话是本机接口。JPA是可移植的,所以如果使用它,您可以选择从Hibernate切换到另一个实现,而无需更改代码。为了以防万一,我会在新代码中这样做。带有会话的本机API可以提供JPA中没有的Hibernate特定特性,而且如果您正在使用为Hibernate构建的现有代码,那么它是很好的。
至于标准与SQL或HQL (或带有JPA的JPA),您可能需要全部。就我个人而言,我发现HQL比标准更强大、更容易阅读。两者都具有不直接绑定到数据库的优点,因此在可能的情况下使用标准或HQL代替SQL。但是,在某些情况下,您可能需要SQL以获得更好的性能。实用主义者获胜。
发布于 2018-04-11 12: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来简化事务管理)来避免许多查询和样板代码。
https://stackoverflow.com/questions/49783520
复制相似问题