20 votes

Relation entre EJB 3.0 et JPA ?

Cela peut sembler évident mais j'ai vu des déclarations contradictoires : JPA fait-il partie d'EJB 3.0 ? Je ne suis pas un spécialiste et c'est assez déroutant pour moi.

Si oui, JPA manipule des Entity Beans ? Ces beans d'entité étant l'interface entre la couche de persistance et la couche métier mettant en œuvre la logique avec des beans sans état ?

La question sous-jacente pour moi est de savoir comment mettre en œuvre une fonction de "recherche d'un utilisateur en fonction de divers critères", où la requête de "recherche" - sa représentation sous forme de chaîne - doit être construite ? Je veux dire, si JPA ne fait pas partie d'EJB, mes beans ne devraient pas être conscients du modèle de données, n'est-ce pas ?

Où se trouve la frontière ?

17voto

Tomasz Nurkiewicz Points 140462

JPA fait-il partie de EJB 3.0 ?

Oui et non... Oui parce que chaque serveur d'application qui prétend mettre en œuvre la spécification EJB 3.0 doit également fournir une mise en œuvre de JPA. Non car JPA peut être facilement utilisé en dehors d'EJB, dans des applications autonomes ou gérées par Spring.

JPA manipule les Entity Beans ?

Haricots d'entité était une idée effrayante dans les EJBs pré-3.0. JPA utilise le terme entités pour se distinguer de l'histoire déshonorante. Mais oui, les entités JPA sont un moyen de faire correspondre des tables de base de données à des objets Java ordinaires. En principe, les modifications apportées à l'objet sont propagées à la base de données et vice-versa (simplification excessive).

Comme je l'ai dit, JPA ne dépend pas d'EJB (considéré comme un haricot de session avec ou sans état) et vice-versa. Mais rien ne vous empêche d'utiliser JPA dans EJB.

Dans votre scénario, vous avez un EJB sans état qui construit la requête et interagit avec la base de données via JPA. Techniquement parlant, vous appellerez des méthodes sur EntityManager injecté dans votre haricot :

@Stateless
public class SearchService {

    @PersistenceContext
    private EntityManager em;

    public List<User> findUsersBornAfter(Date date) {
        return em.
            createQuery("SELECT u FROM User u WHERE u.birthDate > :birthDate ORDER BY name").
            setParameter("birthDate", date).
            getResultList();
    }
}

Comme vous pouvez le constater, la couche métier connaît le modèle de données (évidemment), mais il n'y a aucune dépendance vis-à-vis des services EJB/business en ce qui concerne les entités. Dans cet exemple, une requête JPQL est formée dans la couche service et User est une entité JPA. Appeler getResultList() fait en sorte que le fournisseur JPA traduise JPQL en SQL, exécute la requête et retransmette les résultats à l'utilisateur. User instances d'objets.

La frontière entre EJB et JPA est-elle désormais claire ?

10voto

Bozho Points 273663

Quelques notes :

  • en ce qui concerne le JSR, JPA 1.0 faisait partie de EJB 3.0. Voir ici JPA 2.0 est une JSR distincte ( voir ici )
  • Les "entity beans" sont des EJB pré-3.0, et ils sont heureusement morts. Ils ont été remplacés par JPA.
  • en ce qui concerne les dépendances - JPA ne dépend pas d'EJB, et EJB ne dépend pas de JPA. Cependant, EJB peut gérer l'injection du gestionnaire d'entités JPA
  • vous pouvez utiliser l'un ou l'autre de manière autonome
  • chaque serveur d'application prend en charge à la fois

4voto

Arjan Tijms Points 21682

Pour compléter la réponse de BalusC, voir Wikipedia - Enterprise JavaBean :

Notez que la spécification EJB 3.1 actuelle ne détaille pas la manière dont un serveur d'application fournit la persistance (une tâche déléguée à la spécification JPA), mais détaille plutôt comment la logique métier peut facilement s'intégrer aux services de persistance offerts par le serveur d'application.

Le site intégration élimine certains points douloureux de JPA, à savoir le démarrage et la validation/le retour en arrière d'une transaction, ainsi que la définition de la portée de l'opération. extended persistence context (ce dernier point ne concerne que les beans de session avec état).

Ajoutant à la réponse de Bozho :

  • Dans EJB 3.0, JPA 1.0 faisait partie d'EJB mais en tant que sous-spécifique et utilisable en dehors d'EJB et de Java EE.
  • Dans EJB 3.1, JPA a été complètement séparé d'EJB et JPA 2.0 est à 100% une JSR séparée.

1voto

NimChimpsky Points 20263

De Wikipedia - API Java Persistence :

JavaBeans d'entreprise

La spécification EJB 3.0 (qui fait elle-même partie de la plate-forme Java EE 5) comprend une définition de l'API Java Persistence. Cependant, les utilisateurs finaux n'ont pas besoin d'un conteneur EJB ou d'un serveur d'application Java EE pour exécuter des applications qui utilisent cette API de persistance[1] Les futures versions de l'API de persistance Java seront définies dans une JSR et une spécification distinctes plutôt que dans la JSR/spécification EJB. L'API de persistance Java remplace la solution de persistance d'EJB 2.0 CMP (Container Managed Persistence).

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