2009-05-03 7 views
0

Ich bin auf der Suche nach einer einfachen Möglichkeit, bestehende JPA-Mapping zu erweitern. Die Idee ist wie folgt:Erweitern JPA Entity Mapping

Ich habe ein EAR-Projekt mit EJB3 + JPA-Modul, die ClassA annotiert und Tabelle class_a zugeordnet hat. Aber ich möchte, dass ein anderes Modul (ein anderes EJB-Modul) ClassB enthält, das ClassA weitere Eigenschaften hinzufügt (extend?).

Eine Möglichkeit, die ich über, ist nur diese zusätzlichen Felder der Tabelle class_a hinzufügen und führen Sie nicht-HQL-Abfragen, um diese Daten abzurufen. Es ist nicht gut, da ich viele Dinge per Hand erledigen muss: Typ Mapping, Spalten Mapping, etc.

Ich habe einfache Überprüfung getan, aber es scheint, dass ich ClassA im zweiten Modul (von ClassB) nicht erweitern kann, weil Sie verwenden verschiedene EntityManagerFactories und einige Klassen des ersten Moduls werden nicht von Sekunde zu Sekunde gesehen und umgekehrt.

Ich habe bereits die < JAR-Datei > Tag innerhalb persistence.xml gesehen. Ich brauche so etwas, aber die Verwendung davon erfordert, dass diese Datei im ersten Modul aufgelistet ist und existieren muss (Es wird nicht übersprungen, wenn es nicht gefunden wird). Gibt es so etwas, das man auf das Erweiterungsmodul legen kann (zweites) und nicht das ausziehbare (das erste)?

Wenn es eine Möglichkeit gibt, das JPA-Mapping in der Laufzeit zu erweitern, wäre es großartig. Gibt es so einen Weg? Gibt es eine andere Lösung für mein Problem?

Antwort

0

Die implementierte Lösung ist wie folgt. Ich habe ein Glas und zwei EJB-Module:

  1. Das Gefäß ist die Basis ein. Sie hält die Basisentitäten und lokale Schnittstelle für die Erweiterung:

    @Entity 
    public class BaseEntity { 
        public long id; 
        @Id @GeneratedValue 
        public long getId() {... 
        ... other variables, getters, setters ... 
    } 
    
    @Local 
    public interface EntitiyManagerWithExtendedEntitiesInterface { 
        public EntityManager getEntityManager; 
    } 
    
  2. Das erste EJB-Modul derjenige ist, der die Basisentitäten wird erweitern und EJB hinzufügen, um es EntityManager ist. Dieses Modul enthält auch persistence.xml mit <jar-file>../path_to_first_jar_file.jar</jar-file> Linie.

    @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. Das zweite EJB-Modul wird EJBs, die nur das Glas müssen kompilieren, sondern erfordern die erste EJB auszuführen (ein EJB erfordern, die EntitiyManagerWithExtendedEntitiesInterface Schnittstelle implementieren wird).

    @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) 
        } 
    } 
    

diese Weise kann der Anwendungsserver die Abhängigkeiten zwischen den Modulen zu verwalten, und ich kann einfach tauschen Sie das erste EJB-Modul enthalten einen weiteren Satz von Verlängerungseinheiten haben.