Die Ausweitung JPA Entitätszuordnung
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
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?
Lösung
Die implementierte Lösung ist wie folgt. Ich habe ein Glas und zwei EJB-Module:
-
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; }
-
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; } }
-
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.