Iniziamo ora a padroneggiare le operazioni di persistenza fondamentali per l'inserimento, la cancellazione
e l'aggiornamento di una Entity. Iniziamo con il creare
un nuovo package it.html.hotel
all'interno del progetto ProgettoEjb1
e realizziamo le interfacce che rappresentano
il contratto per la gestione di un Customer:
package it.html.hotel;
import it.html.model.hotel.Customer;
public interface CustomerService {
void addCustomer(Customer customer);
void removeCustomer(Customer customer);
void updateCustomer(Customer customer);
void refreshCustomer(Customer customer);
Customer findById(long id);
}
@Local
public interface CustomerServiceLocal extends CustomerService{}
@Remote
public interface CustomerServiceRemote extends CustomerService{}
E quindi la classe Bean
che implementa il contratto esponendo interfaccia local
e remote
:
@Stateless(name="CustomerServiceBean", mappedName = "CustomerServiceBean")
public class CustomerServiceBean implements CustomerServiceLocal, CustomerServiceRemote{
@PersistenceContext(unitName="ProgettoJpa1")
private EntityManager entityManager;
@Override
public void addCustomer(Customer customer) {
entityManager.persist(customer);
}
@Override
public void removeCustomer(Customer customer) {
entityManager.remove(customer);
}
@Override
public void updateCustomer(Customer customer) {
entityManager.merge(customer);
}
@Override
public void refreshCustomer(Customer customer) {
entityManager.refresh(customer);;
}
@Override
public Customer findById(long id) {
return entityManager.find(Customer.class, id);
}
}
L'annotation @PersistenceContext
specifica la PersistenceUnit
definita nel persistence.xml
ottenendo, grazie
alla dependency injection, un'istanza dell'EntityManager. Possiamo adesso definire degli unit test all'interno della classe
IntegrationTestCase
per testare il session bean CustomerService
:
.....
private static CustomerServiceRemote customerServiceRemote;
private static final String CUSTOMER_REMOTE_JNDI_NAME="/Progetto1Ear/ProgettoEjb1/CustomerServiceBean!it.html.hotel.CustomerServiceRemote";
.....
@Test
public void testAddNewCustomer() throws NamingException{
customerServiceRemote = (CustomerServiceRemote)namingContext.lookup(CUSTOMER_REMOTE_JNDI_NAME);
Customer customer = new Customer();
customer.setFirstName("Mario");
customer.setLastName("Rossi");
customerServiceRemote.addCustomer(customer);
}
@Test
public void testUpdateCustomer() throws NamingException{
customerServiceRemote = (CustomerServiceRemote)namingContext.lookup(CUSTOMER_REMOTE_JNDI_NAME);
Customer customer = customerServiceRemote.findById(54);
customer.setFirstName("Mario");
customer.setLastName("Bianchi");
customerServiceRemote.updateCustomer(customer);
}
Per poter testare l'aggiornamento dobbiamo avere un record sulla tabella CUSTOMER
, eseguiamo quindi prima il test di inserimento,
recuperiamo la chiave generata dal database. Nel nostro caso Postgres ha restituito il valore "54" da utilizzare con il metodo findById
per recuperare l'oggetto dell'Entity Customer appena inserito.
Modifichiamo il last name ed aggiorniamo quindi l'Entity invocando il metodo di update
.
La nostra classe di test è una classe client, nel nostro caso utilizzando Hibernate abbiamo necessità di inserire nel classpath
del progetto ProgettoEjb1
il seguente jar
del core Hibernate:
per evitare l'errore ClassNotFoundException: org.hibernate.collection.internal.PersistentBag
.
In questo capitolo abbiamo fornito una prima introduzione al sistema di persistenza JPA, nel capitolo successivo
introdurremo il linguaggio di interrogazione JPQL.