2009-05-03 8 views
0

Je cherche un moyen facile d'étendre le mappage JPA existant. L'idée est la suivante:Extension du mappage d'entité JPA

J'ai un projet EAR avec le module EJB3 + JPA qui a ClassA annoté et mappé à la table class_a. Mais je veux un autre module (un autre module EJB) pour avoir ClassB qui ajoute plus de propriétés à ClassA (étendre?).

Une façon dont je pensais à propos, est juste d'ajouter ces champs supplémentaires à la table class_a et exécuter des requêtes non-HQL pour récupérer ces données. Ce n'est pas bon car je dois faire beaucoup de choses à la main: mappage de type, mappage de colonne, etc.

J'ai effectué une vérification simple mais il semble que je ne puisse pas étendre ClassA dans le second module (par ClassB) car ils utilisent différentes EntityManagerFactories et certaines classes du premier module ne sont pas vues par la seconde et vice versa.

J'ai déjà vu le tag < fichier jar > dans le fichier persistence.xml. J'ai besoin de quelque chose comme ça, mais l'utilisation de celui-ci nécessite d'avoir ce fichier listé dans le premier module et il doit exister (il ne sautera pas s'il n'est pas trouvé). Y at-il quelque chose comme ça, qui peut être mis sur le module d'extension (deuxième) et non sur le module extensible (le premier)?

S'il existe un moyen d'étendre le mappage JPA en cours d'exécution, ce serait génial. Y a-t-il un tel moyen? Y a-t-il une autre solution à mon problème?

Répondre

0

La solution mise en œuvre est la suivante. J'ai un pot et deux modules EJB:

  1. Le pot est la base d'un. Elle détient les entités de base et l'interface locale pour l'extension:

    @Entity 
    public class BaseEntity { 
        public long id; 
        @Id @GeneratedValue 
        public long getId() {... 
        ... other variables, getters, setters ... 
    } 
    
    @Local 
    public interface EntitiyManagerWithExtendedEntitiesInterface { 
        public EntityManager getEntityManager; 
    } 
    
  2. Le premier module EJB est celui qui étendra les entités de base et ajouter EJB pour l'obtenir est gestionnaire d'entités. Ce module inclut également persistence.xml avec la ligne <jar-file>../path_to_first_jar_file.jar</jar-file>.

    @Entity 
    ... discriminator annotations 
    public class ExtEntity extends BaseEntity { 
        ... additional fields here 
    } 
    
    @Stateless 
    public class EntitiyManagerWithExtendedEntitiesBean implements EntitiyManagerWithExtendedEntitiesInterface { 
        @PersitenceContext 
        EntityManager em; 
        public EntityManager getEntityManager() { 
         return em; 
        } 
    } 
    
  3. Le deuxième module EJB aura des EJBs qui nécessitent que le pot pour compiler, mais nécessitent le premier EJB pour exécuter (nécessite un EJB qui mettra en œuvre l'interface EntitiyManagerWithExtendedEntitiesInterface).

    @Stateless 
    public class getSomeEntity { 
        @EJB 
        EntitiyManagerWithExtendedEntitiesInterface ext; 
        EntityManager em; 
        @PostConstruct 
        public void injectEntityManager() { 
         em = ext.getEntityManager(); 
        } 
        public void ejbInterfaceMethod() { 
         ... method that uses em variable (EntityManager) 
        } 
    } 
    

De cette façon, le serveur d'application devra gérer les dépendances entre les modules et je peux facilement échanger le 1er module EJB pour inclure un autre ensemble d'entités d'extension.

Questions connexes