Question

Je recherche un moyen simple d'étendre le mappage JPA existant. L'idée est la suivante:

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

L’une des solutions envisagées consiste à ajouter ces champs supplémentaires à la table class_a et à exécuter des requêtes non-HQL afin de récupérer ces données. Ce n’est pas bon car je dois faire beaucoup de choses à la main: mappage de types, mappage de colonnes, etc.

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

J'ai déjà vu le < fichier-jar > balise dans persistence.xml. J'ai besoin de quelque chose comme ça, mais son utilisation nécessite d'avoir ce fichier 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 extensible (le second) et non sur le module extensible (le premier)?

S'il était possible d'étendre le mappage JPA au moment de l'exécution, ce serait formidable. Y a-t-il un tel moyen? Y at-il une autre solution à mon problème?

Était-ce utile?

La solution

La solution implémentée est la suivante. J'ai un bocal et deux modules EJB:

  1. Le pot est celui de base. Il contient 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 ajoutera EJB pour obtenir son gestionnaire d'entités. Ce module inclut également persistence.xml avec <jar-file>../path_to_first_jar_file.jar</jar-file> ligne.

    @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 comportera des EJB nécessitant uniquement la compilation du fichier jar, mais nécessitant l'exécution du premier EJB (nécessite un EJB qui implémentera EntitiyManagerWithExtendedEntitiesInterface l'interface).

    @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'applications devra gérer les dépendances entre les modules et je peux facilement permuter le 1er module EJB pour inclure un autre ensemble d'entités d'extension.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top