Nun kann das generische DAO in jeder beliebigen EnterpriseBean, per Dependency Injection, mithilfe der @EJB-Annotaion, geladen werden. Durch das Annotieren der setter-Methode mit @EJB wird eine Referenz des VirtualDao aus dem JNDI Baum geladen. Diese Referenz kann dann in den EnterpriseBean-Methoden beliebig oft verwendet werden.
Listing 6: Remote EnterpriseBean mit dem DAO in Verwendungpackage javamagazin.virtual.ejb@Remotepublic class MyEJBImpl implements MyEJB {private VirtualDao virtualDao;@EJBpublic void setVirtualDao(VirtualDao virtualDao) {this.virtualDao = virtualDao;}public Something retrieveSomething(String arg0, String key) {Something s = virtualDao.getByQuery(key, “myQuery”, arg0);return s;}@TransactionAttribute(TransactionAttributeType.REQUIRED)public Long createSomething(String arg0, String arg1, String key) {Something s = new Something();s.setArg0(arg0);s.setArg1(arg1);return virtualDao.save(key, s);}}
Konfiguration des EntityManager JNDI und dessen Schlüssel
Die Konfigurationstabelle ist sehr simpel aufgebaut (Abb. 1). Sie besteht aus einer ID, die den Primärschlüssel dieser Tabelle stellt, sowie einer eindeutigen CUSTOMER_KEY-Spalte und dem dazugehörigen Wert, die JNDI_ENTRY-Spalte.
Bei der Verwendung einer Konfigurationstabelle muss der Zugriff auf diese bzw. auf die korrespondierende Entität zentral zugänglich gemacht werden. Dafür sollte der Applikationsserver eine Datasource bereitstellen, auf die über einen Eintrag in der persistence.xml zugegriffen werden kann. Nun muss im VirtualDaoImpl ein eigener EntityManager über die @PersistenceContext-Annotation geladen werden, um mit den Konfigurationsentitäten zu interagieren. Natürlich kann auch eine eigene EnterpriseBean, die nur zum Laden der Schlüsselwerte verantwortlich ist, verwendet werden. Eine weitere Möglichkeit, um mit solch einer Konfigurationstabelle zu interagieren, bietet das von Sun bekannte Servicelocator Pattern.
Listing 6: Remote EnterpriseBean mit dem DAO in Verwendungpackage javamagazin.virtual.ejb@Remotepublic class MyEJBImpl implements MyEJB {private VirtualDao virtualDao;@EJBpublic void setVirtualDao(VirtualDao virtualDao) {this.virtualDao = virtualDao;}public Something retrieveSomething(String arg0, String key) {Something s = virtualDao.getByQuery(key, “myQuery”, arg0);return s;}@TransactionAttribute(TransactionAttributeType.REQUIRED)public Long createSomething(String arg0, String arg1, String key) {Something s = new Something();s.setArg0(arg0);s.setArg1(arg1);return virtualDao.save(key, s);}}
Fazit
Durch ein einfaches Anwenden und richtiges Konfigurieren der EJB sowie der JPA-XML-Dateien, wird ein dynamisches Laden von unterschiedlichen Kundendatenbankverbindungen zur Laufzeit ohne viel Aufwand möglich. Wie die einzelnen Beispiele in den Listings zeigen, ist auch der Java-Code einfach gehalten und richtet sich an die EJB-3-Spezifikation. Somit sollte der Java-Code ohne zusätzliche Modifikationen in jedem Applikationsserver laufen.









