Nei capitoli precedenti abbiamo
configurato correttamente un datasource su JBoss e settato l'IDE per il collegamento verso il database Postgres.
Proseguiamo adesso con la configurazione del progetto JPA aprendo il file persistence.xml
presente nel percorso src/META-INF
del progetto ProgettoJpa1
.
Inseriamo quindi il seguente contenuto all'interno del tag persistence unit
:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/PostgresDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"></property>
<property name="hibernate.id.new_generator_mappings" value="false"/>
<property name="hibernate.show_sql" value = "false" />
<property name="hibernate.connection.characterEncoding" value="utf8" />
<property name="hibernate.connection.charSet" value="utf8" />
</properties>
Con questa operazione specifichiamo il JNDI name del datasource, creato all'interno del file standalone-full.xml
, e
il provider di persistenza che intendiamo utilizzare con la specifica JPA: Hibernate
con una serie di impostazioni sul provider stesso.
Prima di procedere è importante sottolineare che PostgreSQL memorizza
colonne, sequence e nomi di tabelle in lower case. Query JDBC su PostgreSQL vengono eseguite con nomi di colonne e tabelle in lower case oppure
con il doppio apice se definite in lower case. Nel nostro caso abbiamo definito volutamene i nomi di colonne e tabelle in upper case, esistono infatti situazioni di questo tipo ed è importante comprendere come affrontare il problema.
Per far in modo che l'EntityManager costruisca query correttamente dobbiamo racchiudere i nomi nelle nostre Entity tra apici doppi, avendo la necessità di anteporre lo slash \
:
@Entity
@Table(name="\"CUSTOMER\"")
@SequenceGenerator(name="CUSTOMER_GENERATOR",
sequenceName="\"CUSTOMER_SEQUENCE\"")
public class Customer implements Serializable {...}
Correggiamo quindi le annotations nelle varie Entity o recuperiamole dal codice di progetto allegato. Facciamo adesso click con il tasto destro del mouse sul file persistence.xml
e selezioniamo "Synchronize Class List".
Vedremo comparire la lista delle classi annotate con annotation @Entity
all'interno del tag provider
:
<class>it.html.model.hotel.Booking</class>
<class>it.html.model.hotel.Customer</class>
<class>it.html.model.hotel.Event</class>
<class>it.html.model.hotel.Room</class>
Questo insieme di classi rappresenta la nostra Persistence Unit, ovvero l'insieme delle classi che saranno gestite dall'ORM.
Il concetto di Persistence Context si riferisce invece alle istanze di queste classi. Il Persistence Context denota infatti
le istanze correntemente sotto il controllo dell'EnitityManager.
Quando un'istanza è sotto il controllo dell'EntityManager
il suo stato può essere salvato sul database o essere aggiornato dal database. Un'istanza di una particolare Entity non è costantemente
sotto il controllo dell'EntityManager, lo è un periodo di tempo sufficiente ad effettuare le operazioni necessarie.
L'EntityManager può
essere visto come il ponte tra il mondo Object Oriented
ed il mondo relazionale. Come illustrato nella seguente figura, quando richiediamo che un'istanza di Entity venga salvata su database,
l'EntityManager traduce questa richiesta in uno statement di inserimento SQL. Quando invece
richiediamo un'Entity, l'EntityManager crea un oggetto per l'Entity, lo popola con i dati letti dal database e lo restituisce.
Le operazioni fondamentali che vedremo nel capitolo successivo sono le seguenti:
Operazione | Descrizione |
---|---|
persist() | Inserire un nuovo oggetto Entity. |
merge() | Aggiornare un oggetto Entity. |
remove() | Rimuovere un oggetto Entity. |
refresh() | Aggiornare lo stato di un oggetto Entity con i valori letti dal database. |