2011-04-17 1 views
1

J'ai un ensemble de POJO JPA qui contiennent des annotations requises pour mapper à mon domaine. Je souhaite également exposer certains services REST qui interagiront avec ces objets de domaine.Besoin d'aide pour la conception avec les POJO utilisés pour les services JPA et les clients REST

Ma tâche actuelle consiste à créer une application android pour accéder à ces services REST. Je ne suis pas en mesure d'utiliser l'objet domaine en raison des annotations JPA qu'ils contiennent. Le compilateur Dalvik se plaint. Je cherche donc une stratégie pour pouvoir exploiter ces objets de domaine de telle sorte qu'un projet Android puisse également utiliser ces objets et ne pas avoir à dupliquer ces objets POJO.

+1

Il semble approprié de déplacer des mappages vers XML si vous souhaitez réutiliser le code source. –

+0

Peut-être avec http://stackoverflow.com/questions/7086433/jpa-best-practices/15656296 – java4africa

Répondre

0

La suggestion de Victor d'externaliser les mappages JPA au format XML plutôt que d'utiliser des annotations fonctionnerait sûrement, mais pourrait être gênante si vous récupérez vos objets JPA à partir d'outils qui génèrent uniquement des annotations.

Je suppose que vous avez besoin de classes Java côté client qui correspondent aux objets que vous sérialiserez dans vos services REST.

Il est possible, mais très fastidieux, de créer des objets DTO - des POJO correspondant exactement aux objets JPA avec des constructeurs appropriés provenant des objets JPA. Cela semble être une quantité excessive d'effort.

Il doit être possible d'écrire un processeur de code source pour supprimer les annotations du Java. Je ne pense pas qu'une simple solution de script regex fonctionnera, je suppose que l'analyse de la source est vraiment nécessaire, donc j'hésite à deviner combien de travail ce serait. Cependant, selon this question's answers l'ensemble de base d'outils est disponible. Je commencerais par cette approche.

0

Je pourrais travailler avec la stratégie suivante.
Cette stratégie fonctionne très bien quand vous ne voulez pas récupérer la collection entière, ou chercher avec quelques critères d'addition, vous pouvez la récupérer (relation de collection) avec la requête nommée. utilise DAO séparé pour l'opération CRUD sur la table JOIN de plusieurs à plusieurs relation par exemple. L'utilisateur peut avoir de nombreux comptes et le compte peut être partagé par de nombreux utilisateurs. créer des modèles de domaine/DAO pour les trois tables, utiliser la cartographie de la relation pour la récupération et pour DDL utiliser les propriétés individuelles.



    @Entity 
    @Table(name="account") 
    public class Account { 
    @Id (name="accountid") 
    private Long accountId; 

    @Column 
    private String type; 

    // removed @OneToMany as it causes issue while serializing to xml 
    @Transient 
    private Collection accountUsers; 

     //rest of the properties n geter setter goes here 
    } 

    @Entity 
    @Table(name="user") 
    public class User { 

    @Id(name="userid") 
    private Long userId; 

    @Column 
    private String name; 
     // by making transient jpa/hibernate does not initialize it with proxy.. so it remains null 
    /* you can populate this property using named query whenever required .*/ 
    @Transient 
    private Collection userAccounts; 

    // rest of the properties n getter setter goes here 

    } 

    @Entity 
    @Table(name="AccountUser") 
    public class AccountUser { 
    // whatever your strategy to implement primary key here , 
    @Id (name="accountuserid") 
    private Long accountUserId; 

    /* please note this annotation , made insertable/updatable false , relation defined just for fetching relation 
    */ 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "accountid", referencedColumnName = "accountid", insertable = false, updatable = false) 
    private Account account; 

// look at insertable/updatable properties its turned off 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "userid", referencedColumnName = "userid", insertable = false, updatable = false) 
    private User user; 

// 
    @Column (name = "userid" ) 
    private Long userId; 

    @Column (name = "accountid" ) 
    private Long accountId; 

    @Column (name="opendate") 
    private Date opendate; 

    } 

    /* use separate dao to save above beans */ 
    // somthing like this 
    public class AccountDAOImpl extends GenericDAOImpl implements AccountDAO { 
    } 

    public class UserDAOImpl extends GenericDAOImpl implements UserDAO { 
    } 

    public class AccountUserDAOImpl extends GenericDAOImpl implements AccountUserDAO { 
    } 

J'ai essayé d'expliquer si besoin de clarification de bien vouloir revenir en arrière. merci

Questions connexes