salve popolo,
sto iniziando a lavorare con le suddette tecnologie, le sto usando per creare un applicazione web interfacciata ad un database, e per fare ciò ho separato la logica di business dalla parte prettamente web. Tuttavia sono nuovo al mondo degli ejb e jpa e non riesco ancora a venirne fuori indenne.
L'applicazione attualmente consiste in due moduli, rappresentati da due distinti progetti in eclipse che poi vengono pacchettizzati in un EAR (terzo progetto eclipse).
Il primo progetto è un EJB, con gli oggetti POJO marcati con le opportune annotazioni (@Entity e tutto il resto) su una base di dati. Ad essi aggiungo le relative classi che implementano i metodi CRUD relative ad ogni bean. Nell'altro progetto o modulo, ci sono le servlet che si occupano di ricevere ed inoltrare le richieste su queste classi appena descritte (semplificando parecchio, per adesso mi interessa far funzionare sta roba). Il tutto poi viene pacchettizzato in un ear con due moduli, uno ejb e l'altro web. Ora il problema riguarda i cosiddetti container-managed entity manager, che dovrei iniettare con le opportune annotazioni. Se lo faccio all'interno di una classe servlet, che è appunto gestita dal servlet container, tutto bene, se lo faccio nelle suddette classi con i metodi CRUD invece non funziona.
Un esempio:
codice:
package it.gobeyond.medical.persistence;
import it.gobeyond.medical.model.Appuntamento;
import javax.ejb.Stateless;
import javax.persistence.*;
@Stateless
public class AppuntamentoDAO {
@PersistenceUnit
private EntityManagerFactory emf;
@PersistenceContext
private EntityManager em;
public Appuntamento findAll() {
return em.find(Appuntamento.class, 2);
}
}
come ho detto, questo bean si trova all'interno del progetto ejb di eclipse, ma emf e em restano null.
Per completezza vi incollo anche i file application.xml
codice:
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" id="Application_ID" version="5">
<display-name>Medical</display-name>
<module>
<web>
<web-uri>MedicalWebTest.war</web-uri>
<context-root>MedicalWebTest</context-root>
</web>
</module>
<module>
<ejb>MedicalEJB.jar</ejb>
</module>
</application>
e persistence.xml
codice:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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/persisten...stence_1_0.xsd">
<persistence-unit name="MedicalEJB" transaction-type="JTA">
<jta-data-source>MedicalMySQL</jta-data-source>
<class>
it.gobeyond.medical.model.Appuntamento</class>
<class>
it.gobeyond.medical.model.Cartella</class>
<class>
it.gobeyond.medical.model.Cliente</class>
</persistence-unit>
</persistence>
il datasource jta definito qui naturalmente c'è e funziona (uso glassfish).
Dove sbaglio? la classe appuntamentoDAO non viene gestita da nessun container? non dovrebbe essercene uno che gestisce gli EJB?