Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 27 di 68
  • livello ninja
Indice lezioni

Implementazione e test di un sistema di persistenza JPA

In questo capitolo iniziamo a padroneggiare le operazioni di persistenza fondamentali per l'inserimento, la cancellazione e l'aggiornamento di una Entity.
In questo capitolo iniziamo a padroneggiare le operazioni di persistenza fondamentali per l'inserimento, la cancellazione e l'aggiornamento di una Entity.
Link copiato negli appunti

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:

Figura 1. EntityManager
Class list

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.

Ti consigliamo anche