Neben der Möglichkeit, EnterpriseBeans über Annotations zu konfigurieren, liefert der EJB-Standard auch die bereits aus den älteren EJB-Versionen bekannte ejb-jar.xml-Datei (im META-INF-Verzeichnis). Falls gleichzeitig Annotationen und die ejb-jar.xml-Datei für die Erstellung von EnterpriseBeans verwendet werden, bekommen die Einträge aus der XML-Datei den Vorzug. Es besteht aber die Möglichkeit, Annotationen und die ejb-jar.xml-Datei gleichzeitig zu verwenden, da die XML-Datei auch nur Teile der Konfiguration beinhalten kann. Mithilfe des persistence-context-ref-Elements sowie dessen Unterelemente (persistence-context-ref-name und persistence-unit-name) kann man mehrere unterschiedliche Datenbankkontexte in dem JNDI ENC (Java Naming and Directory Interface Enterprise Naming Context) registrieren. Über das persistence-unit-context-ref-name-Element wird ein JNDI-Name für den Kontext vergeben. Mithilfe des persistence-unit-name-Elements wird dieser Kontext an eine Datenbank geknüpft. Diese Datenbankverbindung wird, wie es der JPA-Standard beschreibt, in einer persistence.xml-Datei (im META-INF-Verzeichnis) definiert. Üblicherweise ist die Datenbankverbindung über eine Datasource am Application-Server konfiguriert, daher fallen die Einträge in der persistence.xml Datei recht "mager" aus (Listing 3). An dieser Stelle müssen alle notwendigen Kundendatenbankverbindungen angegeben werden. Die in Listing 3 gezeigte persistence.xml definiert drei Datenbank-Units, die über Datasources (definiert über das jta-data-source element) an unterschiedliche Datenbanken gebunden werden.
Listing 3: persistence.xml<?xml version="1.0" encoding="UTF-8"?><persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"version="1.0"><persistence-unit name="customer-1" transaction-type="JTA"><jta-data-source>jdbc/oracle/customer1</jta-data-source></persistence-unit><persistence-unit name="customer-2" transaction-type="JTA"><jta-data-source>jdbc/postgres/customer2</jta-data-source></persistence-unit><persistence-unit name="customer-3" transaction-type="JTA"><jta-data-source>jdbc/mysql/customer3</jta-data-source></persistence-unit></persistence>
Sind alle Datasources eingerichtet sowie die Persistence Units in der persistence.xml vollständig vorhanden, werden im nächsten Schritt die Persistence-Kontexte für das BaseDao im ejb-jar.xml eingetragen.
Listing 4: ejb-jar.xml<?xml version="1.0" encoding="UTF-8"?><ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"version="3.0"><enterprise-beans><session><ejb-name>VirtualDaoImpl</ejb-name><local>javamagazin.virtual.dao.VirtualDao</local><ejb-class>javamagazin.virtual.dao.VirtualDao</ejb-class><session-type>Stateless</session-type><persistence-context-ref><persistence-context-ref-name>persistence/customer-1</persistence-context-ref-name><persistence-unit-name>customer-1</persistence-unit-name></persistence-context-ref><persistence-context-ref><persistence-context-ref-name>persistence/customer-2</persistence-context-ref-name><persistence-unit-name>customer-2</persistence-unit-name></persistence-context-ref><persistence-context-ref><persistence-context-ref-name>persistence/customer-3</persistence-context-ref-name><persistence-unit-name>customer-3</persistence-unit-name></persistence-context-ref></session></enterprise-beans></ejb-jar>
Dabei wird eine lokale zustandslose EnterpriseBean definiert. Über die unterschiedlichen persistence-context-ref-Elemente werden die Datenbankkontexte eingekoppelt. Beim Registrieren der EnterpriseBean am Applikationsserver werden die Kontextreferenzen mit dem im persistence-context-ref-name vergebenen Namen in den JNDI-Baum geschrieben und sind wie folgt daraus zu laden:
Context ctx = new InitialContext();EntityManager manager = (EntityManager)ctx.lookup("java:comp/env/persistence/customer-3");
Jetzt sollte bereits zu erkennen sein, wie es möglich wird, unterschiedliche EntityManager-Instanzen aus dem JNDI in ein und dasselbe DAO zu laden. Nun muss der in Listing 2 vorgestellte Schlüssel noch an den JNDI-Namen des Persistence-Kontexts gebunden werden. Dies kann über eine zentrale Datenbank oder aber auch über eine Properties-Datei oder im "schlimmsten" Fall hartcodiert im Quellcode geschehen. Der Einfachheit halber wird in diesem Beispiel die Properties-Datei verwendet. Die Möglichkeit, mit einer Konfigurationstabelle zu arbeiten, ist unter "Konfiguration des EntityManager JDNI und dessen Schlüssel" beschrieben. Die Properties-Datei gerade einmal drei Einträge:
javamagazin.virtual.customer1=java:comp/env/persistence/customer-1javamagazin.virtual.customer2=java:comp/env/persistence/customer-3javamagazin.virtual.customer3=java:comp/env/persistence/customer-3




