314 votes

Hibernate SessionFactory vs. JPA EntityManagerFactory

Je suis novice dans l'utilisation d'Hibernate et je ne sais pas s'il faut utiliser un fichier Hibernate. SessionFactory ou une JPA EntityManagerFactory pour créer un fichier Hibernate Session .

Quelle est la différence entre les deux ? Quels sont les avantages et les inconvénients de l'utilisation de chacun d'eux ?

6 votes

Cette réponse sur une question dupliquée est vraiment bonne. stackoverflow.com/questions/23445830/

425voto

Bozho Points 273663

Préférez EntityManagerFactory y EntityManager . Ils sont définis par la norme JPA.

SessionFactory y Session sont spécifiques à l'hibernation. Le site EntityManager invoque la session Hibernate sous le capot. Et si vous avez besoin de certaines fonctionnalités spécifiques qui ne sont pas disponibles dans le module EntityManager vous pouvez obtenir la session en appelant :

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

0 votes

Vous êtes une mine de connaissances ! Je débute avec Hibernate et j'aimerais utiliser Hibernate avec les annotations JPA - me recommanderiez-vous de bonnes ressources pour un débutant (en plus de la documentation Hibernate) ?

2 votes

@elpisu - Je ne peux pas recommander, en fait. J'ai utilisé uniquement la documentation officielle comme ressource d'apprentissage (au moins au cours des deux dernières années), donc je ne connais rien d'autre de fiable. Mais la documentation est suffisamment bonne.

7 votes

@Bozho Je sais qu'il est tard mais quels sont les inconvénients d'utiliser SessionFactory et Session ? Pourquoi l'utilisation de JPA est préférable ? Merci

83voto

Vlad Mihalcea Points 3628

SessionFactory vs. EntityManagerFactory

Comme je l'ai expliqué dans le Guide de l'utilisateur d'Hibernate l'Hibernate SessionFactory étend l'interface JPA EntityManagerFactory comme l'illustre le schéma suivant :

JPA and Hibernate relationship

Donc, le SessionFactory est également un JPA EntityManagerFactory .

Les deux SessionFactory y el EntityManagerFactory contiennent les métadonnées de mappage d'entités et vous permettent de créer un fichier Hibernate Session ou un EntityManager .

Session vs. EntityManager

Tout comme le SessionFactory y EntityManagerFactory l'Hibernate Session étend l'interface JPA EntityManager . Ainsi, toutes les méthodes définies par le EntityManager sont disponibles dans la base de données Hibernate Session .

El Session et le `EntityManager traduire les transitions d'état des entités dans les instructions SQL, comme SELECT, INSERT, UPDATE et DELETE.

Hibernate vs. JPA bootstrap

Lorsque vous démarrez une application JPA ou Hibernate, vous avez deux possibilités :

  1. Vous pouvez amorcer via le mécanisme natif d'Hibernate, et créer un fichier SessionFactory via le BootstrapServiceRegistryBuilder . Si vous utilisez Spring, l'amorçage d'Hibernate se fait par le biais de la balise LocalSessionFactoryBean comme illustré par cet exemple GitHub .
  2. Ou, vous pouvez créer une JPA EntityManagerFactory via le Persistence ou la classe EntityManagerFactoryBuilder . Si vous utilisez Spring, l'amorçage de JPA se fait via la fonction LocalContainerEntityManagerFactoryBean comme illustré par cet exemple GitHub .

L'amorçage via JPA est à privilégier. C'est parce que l'interface JPA FlushModeType.AUTO est un bien meilleur choix que l'ancien FlushMode.AUTO qui casse la cohérence lecture-écriture pour les requêtes SQL natives .

Déballage de JPA vers Hibernate

De plus, si vous démarrez via JPA, et que vous avez injecté la fonction EntityManagerFactory via le @PersistenceUnit annotation :

@PersistenceUnit
private EntityManagerFactory entityManagerFactory;

Vous pouvez facilement avoir accès aux sous-jacents Sessionfactory en utilisant le unwrap méthode :

SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

On peut procéder de la même manière avec la JPA EntityManager . Si vous injectez le EntityManager via le @PersistenceContext annotation :

@PersistenceContext
private EntityManager entityManager;

Vous pouvez facilement avoir accès aux sous-jacents Session en utilisant le unwrap méthode :

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

Conclusion

Ainsi, vous devez amorcer via JPA, utiliser la fonction EntityManagerFactory y EntityManager et ne les déballer vers leurs interfaces Hibernate associées que lorsque vous souhaitez accéder à certaines méthodes spécifiques à Hibernate qui ne sont pas disponibles dans JPA, comme l'extraction de l'entité via sa fonction Identifiant naturel .

32voto

toytoy Points 404

Je veux ajouter que vous pouvez également obtenir la session d'Hibernate en appelant getDelegate() méthode de EntityManager .

ex :

Session session = (Session) entityManager.getDelegate();

34 votes

Notez que unwrap() es à privilégier sur getDelegate() selon la documentation de Java : [javaee 6](http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#getDelegate()) y [javaee 7](http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#getDelegate()) .

25voto

Bastian Voigt Points 2063

Je préfère la JPA2 EntityManager API sur SessionFactory parce que c'est plus moderne. Un exemple simple :

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;
}

Je pense qu'il est clair que la première a l'air plus propre et est également plus facile à tester car EntityManager peut être facilement simulé.

23voto

Kumar Sambhav Points 751

L'utilisation de l'approche EntityManagerFactory nous permet d'utiliser les annotations de méthodes de rappel comme @PrePersist, @PostPersist, @PreUpdate sans configuration supplémentaire.

L'utilisation de callbacks similaires lors de l'utilisation de SessionFactory nécessitera des efforts supplémentaires.

Les documents relatifs à Hibernate se trouvent à l'adresse suivante aquí y aquí .

Question connexe sur les FOS y Discussion du Forum de printemps

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X