JDBC è l'acronimo di Java Database Connectivity e fornisce una serie di API Java per l'accesso ai database relazionali dal programma Java. Queste API Java consentono ai programmi Java di eseguire istruzioni SQL e interagire con qualsiasi database conforme a SQL.
ORM sta per Ooggetto-Relazionale Mapping (ORM) è una tecnica di programmazione per convertire i dati tra database relazionali e linguaggi di programmazione orientati agli oggetti come Java, C # ecc.
Un sistema ORM presenta i seguenti vantaggi rispetto al semplice JDBC
Sr.No. | Vantaggi |
---|---|
1 | Consente l'accesso al codice aziendale agli oggetti anziché alle tabelle DB. |
2 | Nasconde i dettagli delle query SQL dalla logica OO. |
3 | Basato su JDBC "sotto il cofano" |
4 | Non è necessario occuparsi dell'implementazione del database. |
5 | Entità basate su concetti di business piuttosto che sulla struttura del database. |
6 | Gestione delle transazioni e generazione automatica delle chiavi. |
7 | Sviluppo rapido dell'applicazione. |
Esistono diversi framework persistenti e opzioni ORM in Java.
Enterprise JavaBeans Entity Beans
Oggetti dati Java
Castor
TopLink
Primavera DAO
Hibernate
Hibernate è una soluzione ORM (Object-Relational Mapping) per JAVA ed è stata creata come framework persistente open source creato da Gavin King nel 2001. È un servizio di query e persistenza relazionale a oggetti potente e ad alte prestazioni per qualsiasi applicazione Java.
Hibernate associa le classi Java alle tabelle del database e dai tipi di dati Java ai tipi di dati SQL e solleva lo sviluppatore dal 95% delle comuni attività di programmazione relative alla persistenza dei dati.
Di seguito sono riportati i vantaggi dell'utilizzo di Hibernate.
Hibernate si occupa di mappare le classi Java alle tabelle del database utilizzando file XML e senza scrivere alcuna riga di codice.
Fornisce API semplici per archiviare e recuperare oggetti Java direttamente da e verso il database.
Se ci sono modifiche nel database o in qualsiasi tabella, è necessario modificare solo le proprietà del file XML.
Sottragga i tipi SQL non familiari e forniscici di lavorare intorno agli oggetti Java familiari.
Hibernate non richiede un server delle applicazioni per funzionare.
Manipola associazioni complesse di oggetti del database.
Riduci al minimo l'accesso al database con strategie di recupero intelligenti.
Fornisce query di dati semplici.
Hibernate supporta quasi tutti i principali RDBMS. Di seguito è riportato un elenco di alcuni dei motori di database supportati da Hibernate.
Motore di database HSQL
DB2/NT
MySQL
PostgreSQL
FrontBase
Oracle
Database di Microsoft SQL Server
Sybase SQL Server
Informix Dynamic Server
Hibernate supporta una varietà di altre tecnologie, incluse le seguenti:
XDoclet Spring
J2EE
Plug-in di Eclipse
Maven
Di seguito sono riportati i componenti / oggetti chiave di Hibernate:
Configuration - Rappresenta un file di configurazione o di proprietà richiesto da Hibernate.
SessionFactory - Configura Hibernate per l'applicazione utilizzando il file di configurazione fornito e consente di creare un'istanza di un oggetto Session.
Session - Utilizzato per ottenere una connessione fisica con un database.
Transaction - Rappresenta un'unità di lavoro con il database e la maggior parte dell'RDBMS supporta la funzionalità di transazione.
Query - Utilizza una stringa SQL o Hibernate Query Language (HQL) per recuperare i dati dal database e creare oggetti.
Criteria - Utilizzato per creare ed eseguire query con criteri orientati agli oggetti per recuperare oggetti.
L'oggetto Configurazione fornisce due componenti chiave:
Database Connection- Questo viene gestito tramite uno o più file di configurazione supportati da Hibernate. Questi file sonohibernate.properties e hibernate.cfg.xml.
Class Mapping Setup
Questo componente crea la connessione tra le classi Java e le tabelle del database.
L'oggetto Configuration è il primo oggetto Hibernate creato in qualsiasi applicazione Hibernate e di solito viene creato solo una volta durante l'inizializzazione dell'applicazione. Rappresenta un file di configurazione o delle proprietà richiesto da Hibernate.
L'oggetto di configurazione viene utilizzato per creare un oggetto SessionFactory che a turno configura Hibernate per l'applicazione utilizzando il file di configurazione fornito e consente di istanziare un oggetto Session. SessionFactory è un oggetto thread-safe e utilizzato da tutti i thread di un'applicazione.
SessionFactory è un oggetto pesante, quindi di solito viene creato durante l'avvio dell'applicazione e conservato per un uso successivo. Avresti bisogno di un oggetto SessionFactory per database utilizzando un file di configurazione separato. Quindi, se stai usando più database, dovresti creare più oggetti SessionFactory.
Una sessione viene utilizzata per ottenere una connessione fisica con un database. L'oggetto Session è leggero e progettato per essere istanziato ogni volta che è necessaria un'interazione con il database. Gli oggetti persistenti vengono salvati e recuperati tramite un oggetto Session.
Gli oggetti della sessione non dovrebbero essere tenuti aperti per molto tempo perché di solito non sono thread-safe e dovrebbero essere creati e distrutti secondo necessità.
Una transazione rappresenta un'unità di lavoro con il database e la maggior parte dell'RDBMS supporta la funzionalità di transazione. Le transazioni in Hibernate vengono gestite da un gestore delle transazioni e da una transazione sottostanti (da JDBC o JTA).
Questo è un oggetto opzionale e le applicazioni Hibernate potrebbero scegliere di non utilizzare questa interfaccia, invece di gestire le transazioni nel proprio codice dell'applicazione.
Gli oggetti query utilizzano una stringa SQL o Hibernate Query Language (HQL) per recuperare i dati dal database e creare oggetti. Un'istanza di Query viene utilizzata per associare i parametri della query, limitare il numero di risultati restituiti dalla query e infine per eseguire la query.
Gli oggetti Criteria vengono utilizzati per creare ed eseguire query di criteri orientate agli oggetti per recuperare gli oggetti.
Sr.No. | Proprietà e descrizione |
---|---|
1 | hibernate.dialect Questa proprietà fa in modo che Hibernate generi l'SQL appropriato per il database scelto. |
2 | hibernate.connection.driver_class La classe del driver JDBC. |
3 | hibernate.connection.url L'URL JDBC all'istanza del database. |
4 | hibernate.connection.username Il nome utente del database. |
5 | hibernate.connection.password La password del database. |
6 | hibernate.connection.pool_size Limita il numero di connessioni in attesa nel pool di connessioni del database Hibernate. |
7 | hibernate.connection.autocommit Consente l'utilizzo della modalità autocommit per la connessione JDBC. |
Le istanze possono esistere in uno dei tre stati seguenti in un dato momento:
transient - Una nuova istanza di una classe persistente che non è associata a una sessione e non ha alcuna rappresentazione nel database e nessun valore identificativo è considerata transitoria da Hibernate.
persistent- È possibile rendere persistente un'istanza transitoria associandola a una sessione. Un'istanza persistente ha una rappresentazione nel database, un valore identificativo ed è associata a una sessione.
detached - Una volta chiusa la sessione di ibernazione, l'istanza persistente diventerà un'istanza scollegata.
Il metodo Session.beginTransaction avvia un'unità di lavoro e restituisce l'oggetto Transaction associato.
Session.createCriteria crea una nuova istanza di Criteria, per la data classe di entità o una superclasse di una classe di entità.
Session.createQuery crea una nuova istanza di Query per la stringa di query HQL specificata.
Session.createSQLQuery crea una nuova istanza di SQLQuery per la stringa di query SQL specificata.
Session.delete rimuove un'istanza persistente dal datastore.
Session.get restituisce l'istanza persistente dell'entità denominata data con l'identificatore specificato o null se non esiste un'istanza persistente di questo tipo.
Session.refresh rilegge lo stato dell'istanza data dal database sottostante.
Session.save salva lo stato dell'istanza data dal database sottostante.
Session.update aggiorna lo stato dell'istanza data dal database sottostante.
Session.saveOrUpdate salva (Object) o aggiorna (Object) l'istanza data.
Le classi Java i cui oggetti o istanze verranno memorizzate nelle tabelle del database sono chiamate classi persistenti in Hibernate.
Ci sono le seguenti regole principali delle classi persistenti, tuttavia nessuna di queste regole è un requisito fondamentale.
Tutte le classi Java che verranno mantenute necessitano di un costruttore predefinito.
Tutte le classi dovrebbero contenere un ID per consentire una facile identificazione dei tuoi oggetti all'interno di Hibernate e nel database. Questa proprietà è mappata alla colonna della chiave primaria di una tabella di database.
Tutti gli attributi che verranno mantenuti dovrebbero essere dichiarati privati e avere getXXX e setXXX metodi definiti nello stile JavaBean.
Una caratteristica centrale di Hibernate, i proxy, dipende dal fatto che la classe persistente non sia finale o dall'implementazione di un'interfaccia che dichiari tutti i metodi pubblici.
Tutte le classi che non estendono o implementano alcune classi e interfacce specializzate richieste dal framework EJB.
Una mappatura oggetto / relazionale viene solitamente definita in un documento XML. Questo file di mappatura indica a Hibernate come mappare la classe o le classi definite alle tabelle del database. Dobbiamo salvare il documento di mappatura in un file con il formato <classname> .hbm.xml.
Il documento di mappatura è un documento XML con estensione <hibernate-mapping> come elemento radice che contiene tutti gli elementi <class>.
Il <class>gli elementi vengono utilizzati per definire associazioni specifiche da classi Java alle tabelle del database. Il nome della classe Java viene specificato utilizzando ilname l'attributo dell'elemento class e il nome della tabella del database viene specificato utilizzando il table attributo.
Il <id>L'elemento mappa l'attributo ID univoco nella classe alla chiave primaria della tabella del database. Ilname l'attributo dell'elemento id si riferisce alla proprietà nella classe e nel file columnl'attributo si riferisce alla colonna nella tabella del database. Iltype l'attributo contiene il tipo di mappatura ibernazione, questo tipo di mappatura convertirà da Java a tipo di dati SQL.
Il <generator>l'elemento all'interno dell'elemento id viene utilizzato per generare automaticamente i valori della chiave primaria. Impostare ilclass l'attributo dell'elemento generatore è impostato su native per lasciare che ibernazione raccolga entrambi identity, sequence o hilo algoritmo per creare la chiave primaria a seconda delle capacità del database sottostante.
Il <property>elemento viene utilizzato per mappare una proprietà di classe Java a una colonna nella tabella del database. Ilname l'attributo dell'elemento si riferisce alla proprietà nella classe e nel columnl'attributo si riferisce alla colonna nella tabella del database. Iltype l'attributo contiene il tipo di mappatura ibernazione, questo tipo di mappatura convertirà da Java a tipo di dati SQL.
Questo viene mappato con un elemento <set> e inizializzato con java.util.HashSet.
Questo è mappato con un elemento <set> e inizializzato con java.util.TreeSet. L'attributo di ordinamento può essere impostato su un confronto o su un ordinamento naturale.
Questo è mappato con un elemento <list> e inizializzato con java.util.ArrayList.
Viene mappato con un elemento <bag> o <ibag> e inizializzato con java.util.ArrayList.
Questo è mappato con un elemento <map> e inizializzato con java.util.HashMap.
Questo è mappato con un elemento <map> e inizializzato con java.util.TreeMap. L'attributo di ordinamento può essere impostato su un confronto o su un ordinamento naturale.
Un'associazione molti-a-uno è il tipo più comune di associazione in cui un oggetto può essere associato a più oggetti. Ad esempio, uno stesso oggetto indirizzo può essere associato a più oggetti dipendente.
L'elemento <many-to-one> viene utilizzato per definire un'associazione molti-a-uno. L'attributo name è impostato sulla variabile definita nella classe genitore. L'attributo della colonna viene utilizzato per impostare il nome della colonna nella tabella padre.
Un'associazione uno-a-uno è simile all'associazione molti-a-uno con la differenza che la colonna verrà impostata come unica. Ad esempio, un oggetto indirizzo può essere associato a un singolo oggetto dipendente.
L'elemento <many-to-one> viene utilizzato per definire l'associazione uno-a-uno. L'attributo name è impostato sulla variabile definita nella classe genitore. L'attributo della colonna viene utilizzato per impostare il nome della colonna nella tabella padre che è impostato su univoco in modo che solo un oggetto possa essere associato a un altro oggetto.
Nell'associazione di mappatura uno-a-molti, un oggetto può essere associato a più oggetti. Ad esempio, l'oggetto Employee si riferisce a molti oggetti Certificate.
Una mappatura uno-a-molti può essere implementata utilizzando una raccolta java Set che non contiene alcun elemento duplicato.
L'elemento <one-to-many> dell'elemento set indica che un oggetto è correlato a molti altri oggetti.
Una mappatura molti-a-molti può essere implementata utilizzando una raccolta java Set che non contiene alcun elemento duplicato.
L'elemento <many-to-many> indica che un oggetto è correlato a molti altri oggetti e gli attributi di colonna vengono utilizzati per collegare la colonna intermedia.
Sì, SessionFactory è un thread-safe ed è possibile accedervi da più thread contemporaneamente.
No, la sessione non è thread-safe.
session.save salva l'oggetto e restituisce l'id dell'istanza mentre persist non restituisce nulla dopo aver salvato l'istanza.
Ci sono le seguenti differenze tra i metodi get () e load ().
get () restituisce null se non sono presenti dati, mentre il caricamento genera un'eccezione ObjectNotFoundException in questo caso.
get () colpisce sempre il database mentre il metodo load () non raggiunge il database.
get () restituisce l'oggetto effettivo mentre load () restituisce l'oggetto proxy.
Una caratteristica centrale di Hibernate, i proxy, dipende dal fatto che la classe persistente non sia finale o dall'implementazione di un'interfaccia che dichiari tutti i metodi pubblici.
Tutte le classi che non estendono o implementano alcune classi e interfacce specializzate richieste dal framework EJB.
Il caricamento lento è una tecnica in cui gli oggetti vengono caricati su richiesta. A partire da Hibernate 3, il caricamento lento è abilitato per impostazione predefinita in modo che gli oggetti figlio non vengano caricati quando viene caricato il genitore.
HQL sta per Hibernate Query Language. Accetta oggetti Java nello stesso modo in cui SQL accetta le tabelle. HQL è un linguaggio di query orientato agli oggetti ed è indipendente dal database.
La cache di primo livello è la cache di sessione ed è una cache obbligatoria attraverso la quale devono passare tutte le richieste. L'oggetto Session mantiene un oggetto sotto il proprio potere prima di inviarlo al database.
La cache di secondo livello è una cache opzionale e la cache di primo livello verrà sempre consultata prima di tentare di individuare un oggetto nella cache di secondo livello. La cache di secondo livello può essere configurata per classe e per raccolta ed è principalmente responsabile della memorizzazione nella cache degli oggetti tra le sessioni.
Hibernate implementa anche una cache per i set di risultati delle query che si integra strettamente con la cache di secondo livello.
Si tratta di una funzionalità facoltativa e richiede due aree cache fisiche aggiuntive che contengono i risultati delle query memorizzate nella cache e i timestamp dell'ultimo aggiornamento di una tabella. Ciò è utile solo per le query eseguite di frequente con gli stessi parametri.
Una strategia di concorrenza è un mediatore responsabile della memorizzazione di elementi di dati nella cache e del loro recupero dalla cache. Se si intende abilitare una cache di secondo livello, sarà necessario decidere, per ciascuna classe e raccolta persistente, quale strategia di concorrenza della cache utilizzare.
Transactional - Utilizzare questa strategia per i dati per lo più in lettura in cui è fondamentale prevenire dati obsoleti nelle transazioni simultanee, nel raro caso di un aggiornamento.
Read-write - Usa ancora questa strategia per i dati per lo più in lettura, dove è fondamentale prevenire dati obsoleti nelle transazioni simultanee, nel raro caso di un aggiornamento.
Nonstrict-read-write- Questa strategia non garantisce la coerenza tra la cache e il database. Utilizzare questa strategia se i dati non cambiano quasi mai e una piccola probabilità di dati obsoleti non è di fondamentale importanza.
Read-only- Una strategia di concorrenza adatta a dati che non cambiano mai. Usalo solo per i dati di riferimento.
Cosa c'è dopo ?
Inoltre puoi svolgere i compiti che hai svolto in passato con l'argomento e assicurarti di essere in grado di parlarne con sicurezza. Se sei più fresco, l'intervistatore non si aspetta che tu risponda a domande molto complesse, piuttosto devi rendere i tuoi concetti di base molto forti.
Secondo, non importa davvero molto se non puoi rispondere a poche domande, ma importa che qualunque cosa tu abbia risposto, devi aver risposto con sicurezza. Quindi sentiti sicuro durante il tuo colloquio. Noi di tutorialspoint ti auguriamo buona fortuna per avere un buon intervistatore e tutto il meglio per il tuo futuro impegno. Saluti :-)