Frage

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

Ich habe ein EAR-Projekt mit EJB3 + JPA-Modul, das und KlasseA kommentiert hat Tabelle class_A abgebildet. Aber ich mag ein anderes Modul (eine andere EJB-Modul) ClassB haben, die mehr Eigenschaften zu KlasseA fügt (verlängern?).

Eine Möglichkeit, dass ich zwar über, nur ist diese zusätzliche Felder der class_A Tabelle hinzuzufügen und nicht-HQL-Abfragen ausgeführt werden, um diese Daten abzurufen. Es ist nicht gut, wie ich von Hand viele Dinge tun müssen: Typzuordnung, Spaltenzuordnung, etc.

.

Ich habe einfache Prüfung gemacht, aber es scheint, dass ich nicht KlasseA im zweiten Modul (durch ClassB) erweitern kann, weil sie unterschiedliche EntityManagerFactories verwenden und einige Klassen aus dem ersten Modul werden nicht durch die zweite und umgekehrt gesehen.

Ich habe bereits den Tag in persistence.xml gesehen. Ich brauche so etwas, aber die Verwendung es erfordert, dass die Datei im ersten Modul aufgelistet zu haben, und es muss vorhanden sein (Es wird nicht überspringen, wenn nicht gefunden). Gibt es so etwas, das auf dem Verlängerungsmodul (zweite) und nicht die ausfahrbare eine (erste) gesetzt werden kann?

Wenn es eine Möglichkeit, das JPA-Mapping in der Laufzeit zu verlängern wäre es toll. Gibt es eine solche Art und Weise? Gibt es eine andere Lösung für mein Problem?

War es hilfreich?

Lösung

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. Die erste EJB-Modul ist derjenige, der die Basisentitäten verlängern und EJB hinzufügen zu bekommen EntityManager es 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).

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

Auf diese Weise der Anwendungsserver müssen die Abhängigkeiten zwischen den Modulen verwalten und ich kann das erste EJB-Modul enthalten einen weiteren Satz von Verlängerungs Einheiten leicht tauschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top