java - from - Hibernate SessionFactory vs. EntityManagerFactory




get entitymanager from sessionfactory (4)

A interface EntityManager é semelhante a sessionFactory no modo de hibernação. EntityManager sob o pacote javax.persistance mas session e sessionFactory no pacote org.hibernate.Session / sessionFactory.

O gerenciador de entidades é específico de JPA e session / sessionFactory são específicos de hibernação.

https://code.i-harness.com

Eu sou novo no Hibernate e não estou claro se deve usar um SessionFactory ou EntityManagerFactory para obter a sessão de hibernação. Qual é a diferença entre os dois? Prós e contras?


Eu prefiro a API JPA2 EntityManager sobre SessionFactory , porque parece mais moderna. Um exemplo simples:

JPA:

@PersistenceContext
EntityManager entityManager;

public List<MyEntity> findSomeApples() {
  return entityManager
     .createQuery("from MyEntity where apples=7", MyEntity.class)
     .getResultList();
}

SessionFactory:

@Autowired
SessionFactory sessionFactory;

public List<MyEntity> findSomeApples() {
  Session session = sessionFactory.getCurrentSession();
  List<?> result = session.createQuery("from MyEntity where apples=7")
      .list();
  @SuppressWarnings("unchecked")
  List<MyEntity> resultCasted = (List<MyEntity>) result;
  return resultCasted;
}

Eu acho que está claro que o primeiro parece mais limpo e também é mais fácil de testar porque o EntityManager pode ser facilmente ridicularizado.


O uso da abordagem EntityManagerFactory nos permite usar anotações de método de retorno de chamada como @PrePersist, @ PostPersist, @ PreUpdate sem nenhuma configuração extra.

Usar retornos de chamada semelhantes ao usar o SessionFactory exigirá esforços extras.

Documentos relacionados ao Hibernate podem ser encontrados here e here .

Discussão sobre SOF Question e Spring Fórum


Prefira EntityManagerFactory e EntityManager . Eles são definidos pelo padrão JPA.

SessionFactory e Session são específicas do hibernate. O EntityManager invoca a sessão de hibernação sob o capô. E se você precisar de alguns recursos específicos que não estão disponíveis no EntityManager , você pode obter a sessão chamando:

Session session = entityManager.unwrap(Session.class);






hibernate-entitymanager