IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Combiner les annotations JPA et JAXB?


Sujet :

JPA Java

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut Combiner les annotations JPA et JAXB?
    Bonjour,

    Comme l'indique le titre, je me pose des questions sur le mapping Relationnel-Objet-XML dans le cadre d'une architecture 2-tiers composée de:

    - une couche d'EJB DAO [entités JPA] (EntityManager, Criteria, requêtes JPQL dynamiques).
    - une couches de WebServices [entités JAXB] (SOAP, Rest).

    Ma question est simple:
    Que feriez vous ?
    - Combiner les annotations JPA et JAXB dans une même classe .
    - Faire un mapping entité JPA / JAXB (DTO JAXB plus light).
    - Utiliser le design pattern Proxy avec l'entité JAXB contenant l'entité JPA (un peu complexe dans le cadre des relations entre les classes).

    Merci et bonne réflexion!

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je me suis posé la même question.
    Sur le projet sur lequel je travail, on a séparé, on a donc nos classes Entity annotées et nos classes XML annotées représentant les mêmes objets.
    C'est un peu lourd, on est obligé de convertir dans les deux sens les objets, mais au moins c'est bien séparé.

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Salut,

    Avec cette approche, tu as deux cas:

    1:
    Soit tu as une entité JPA "lourde" (toute les relations et champs non utilisés côté présentation) avec une entité JAXB "légère" (entièrement orientés présentation).

    Exemple:
    On a une entité JPA Personne et son homologue JAXB PersonneDTO.
    Personne: id, nom, prenom, date naissance
    PersonneDTO: id, nom, prenom
    Dans le cas ou tu veux faire un merge tu es obligé de récupérer au préalable ton entité JPA avec un find pour avoir les champs non présents dans l'entité JAXB ce qu'y est assez lourd je pense.

    2:
    Soit tu as strictement les mêmes champs pour les deux entités. Ce qui est assez lourd en traitement (copie complète d'objet, marshalling complet également, grosse quantité de données en transit sur le réseau). Mais tu évites le find côté DAO.

    C'est vraiment prise de tête cette histoire lol

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Bonjour je Up sur ce topic parce que j'ai un problème qui appartient au même contexte.
    Pour m'amuser je voudrais ajouter un petit Chat en HTML5/AJAX sur mon site avec des appels à des WebServices en REST/JSON.
    J'ai décidé une approche architecturale type Façade et Adapter pour designer mes modèles JAXB.

    Pour cette fonctionnalité j'utilise 3 entités JPA/JAXB:
    SiteUser, Account, Adress
    Une entité JAXB pure:
    Chat (contenant une liste de SiteUser)

    Je voudrais alléger les données à marshaller, j'ai donc utilisé une interface (Façade) sur SiteUser (ISiteUserChat) pour rendre XmlTransient toutes les propriétés exceptées celle que je veux garder.
    Comme j'ai du annoter une interface j'ai du utiliser un Adapter (contenu dans la classe SiteUser).
    Malheureusement lorsque j'accède à mon webservice et que je veux afficher un chat en XML, j'ai l'intégralité des données de SiteUser au lieu d'avoir uniquement les propriétés que je voulais garder.

    Je met mes sources que j'ai simplifié pour que ce soit plus lisible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.NONE) 
    public class Chat extends AbstractRootEntity {
     
        private List<ISiteUserChat> participants;
        private String richTextContent;
     
        public void addMessage(String message) {
            richTextContent += "<br>" + message;
        }
     
        //je ne prend que les 1000 derniers caractères
        @XmlAttribute
        public String getRichTextContent() {
            int length = richTextContent.length();
            return richTextContent.substring(length - 1000 < 0 ? 0 : length - 1000, length);
        }
     
        @XmlElement
        public List<ISiteUserChat> getParticipants() { 
            return participants; 
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @Entity
    @Inheritance(strategy= InheritanceType.JOINED)
    public abstract class Person extends AbstractRootEntity {
     
        private String lastName;
        private String firstName;
        @Embedded
        private Adress adress;
        @Temporal(javax.persistence.TemporalType.DATE)
        private java.util.Date birthDate;
     
        //getters et setters
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    @Entity
    public class SiteUser extends Person implements ISiteUserChat {
     
        @Embedded
        private Account account;
     
        float points; 
     
        static class SiteUserChatAdapter extends XmlAdapter<SiteUser, ISiteUserChat> {
     
            @Override
            public ISiteUserChat unmarshal(SiteUser v) throws Exception {
                return (ISiteUserChat)v;
            }
            @Override 
            public SiteUser marshal(ISiteUserChat v) throws Exception {
                return (SiteUser)v;
            }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    @XmlJavaTypeAdapter(SiteUser.SiteUserChatAdapter.class)
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.NONE) 
    public interface ISiteUserChat { 
     
        //propriétés de la classe SiteUser
        @XmlElement
        public IAccountChat getAccount();
     
        //propriétés de la classe Person
        @XmlTransient
        public Adress getAdress();
        @XmlTransient
        public String getLastName();
        @XmlAttribute //je ne veux que le prénom
        public String getFirstName();
     
    }
    Je cherche un moyen d'arriver à mes fins, je suis débutant en JAXB donc je suis ouvert à d'autres concepts d'architecture également.

    A+

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Je remonte également ce topic pour les mêmes raisons que saveriu, car j'ai la même problématique que lui.
    Je trouve aussi que deux faires deux couches séparées est plus lisible par contre niveau maintenance c'est tout de même conséquent.

    HadanMarv

  6. #6
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Je remonte cette discu pour faire la remarque exactement inverse.

    J'utilise la double annotation pour un usage différent.
    Je travaille sur un système d'échange (EAI/ESB)
    dans ce cadre j'ai de très nombreux cas de lecture de données dans une base pour les transmettre via JMS et vice versa.

    en utilisant la double annotation mon code est devenu totalement générique. j'indique à mon connecteur BDD le package contenant les classes annotées et le persistance Unit à utiliser, et à mon connecteur JMS la file.

    mon code peux alors envoyer les objets de la BDD vers JMS et vice versa.

    en terme d'évolution de maintenance etc.
    tout le code est générique

    ne reste donc que le modèle qui est à définir pour chaque entité métier à véhiculer.
    A+JYT

Discussions similaires

  1. Séparer les annotations JPA et JAXB
    Par titititiangel dans le forum JPA
    Réponses: 5
    Dernier message: 18/06/2013, 09h06
  2. Réponses: 1
    Dernier message: 17/11/2011, 03h06
  3. (macosX,eclipse 3.4) erreurs sur les annotations JPA
    Par olivier57b dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 04/01/2009, 16h11
  4. Combiner les recherches FAQ/Sources
    Par Tofalu dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 03/10/2005, 23h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo