transazioni manuali Java hibernate jpa

 

Approfondimento Come funzionano le transazioni:

https://www.objectdb.com/java/jpa/start/connection

 

  1. Entity Class
  2. Database Connection
  3. CRUD Operations

1. Definizione di una classe di entità JPA:

Per poter archiviare Pointoggetti nel database utilizzando JPA è necessario definire una classe di entità . Una classe di entità JPA è una classe POJO (Plain Old Java Object), cioè una normale classe Java che è contrassegnata (annotata) come avente la capacità di rappresentare oggetti nel database. Concettualmente questo è simile alle classi serializzabili, che sono contrassegnate come aventi la possibilità di essere serializzate.

 

@Entity
 public  class  Point  { 
    // Campi persistenti: 
    private  int x ; 
    privato  int y ;

    // Costruttore
    // Metodi di accesso getters and setters: 
 

2. Database connection:

  • Ottenere una connessione al database JPA

In JPA una connessione al database è rappresentata dall’interfaccia. Pertanto, per manipolare un database ObjectDB abbiamo bisogno di un’istanza. Anche le operazioni che modificano il contenuto del database richiedono un’istanza.EntityManagerEntityManagerEntityTransaction

  • Ottenere una EntityManagerFactory

L’ottenimento di un’istanza consiste in due passaggi. Per prima cosa dobbiamo ottenere un’istanza che rappresenti il ​​database pertinente e quindi possiamo utilizzare quell’istanza di fabbrica per ottenere un’istanza.EntityManagerEntityManagerFactoryEntityManager

JPA richiede la definizione di un’unità di persistenza in un file XML per poter generare un file EntityManagerFactory. Ma quando usi ObjectDB puoi definire un’unità di persistenza standard in un file XML oppure puoi semplicemente fornire il percorso del file del database ObjectDB:

 

EntityManagerFactory emf = Persistence.createEntityManagerFactory("objectdb:$objectdb/db/points.odb");

Il metodo statico prevede un nome di unità di persistenza come argomento, ma quando si utilizza ObjectDB, viene accettato anche qualsiasi percorso del file di database valido (assoluto o relativo). Qualsiasi stringa che inizia con il prefisso o termina con o è considerata da ObjectDB un URL di database anziché un nome di unità di persistenza. La variabile rappresenta la home directory di ObjectDB (per impostazione predefinita, la directory in cui è installato ObjectDB). Se non esiste ancora alcun file di database nel percorso specificato, ObjectDB tenterà di crearne uno.createEntityManagerFactoryobjectdb:.odb.objectdb
$objectdb

Il EntityManagerFactoryviene utilizzato anche per chiudere il database una volta terminato di usarlo:

emf.close();

Ottenere un EntityManager

Una volta che abbiamo un possiamo facilmente ottenere un’istanza:EntityManagerFactoryEntityManager

 
EntityManager em = emf.createEntityManager();

L’ EntityManageristanza rappresenta una connessione al database. Quando si utilizza JPA, ogni operazione su un database è associata a un file EntityManager. Inoltre, in un’applicazione multithread ogni thread di solito ha la propria EntityManageristanza condividendo allo stesso tempo un singolo file EntityManagerFactory.

Quando la connessione al database non è più necessaria si EntityManagerpuò chiudere:

emf.close();

La chiusura di un EntityManagernon chiude il database stesso (questo è il lavoro della fabbrica come spiegato in precedenza). Una volta EntityManagerchiuso, l’oggetto non può essere riutilizzato. Tuttavia, l’ EntityManagerFactoryistanza proprietaria può preservare le EntityManager'srisorse (come un puntatore a un file di database o un socket a un server remoto) in un pool di connessioni e utilizzarle per accelerare la EntityManagercostruzione futura.

 

Utilizzo di una EntityTransaction

Le operazioni che modificano il contenuto del database, come l’archiviazione, l’aggiornamento e l’eliminazione, devono essere eseguite solo all’interno di una transazione attiva.

Dato un , em, è molto facile iniziare una transazione:EntityManager

em.getTransaction().begin();

Esiste una relazione uno a uno tra EntityManagerun’istanza e le istanze associate restituita dal metodo.EntityTransactiongetTransaction

Quando una transazione è attiva è possibile richiamare EntityManagermetodi che modificano il contenuto del database, come e . Gli aggiornamenti del database vengono raccolti e gestiti in memoria e applicati al database al momento del commit della transazione:persistremove


em.getTransaction().commit();

em.getTransaction().begin();
//business logic es. 
em.persist(oggetto);
em.getTransaction().commit();

Lascia un commento