Note that there are some explanatory texts on larger screens.

plurals
  1. POSome doubts related to the interface use in Java (creating an Hibernate DAO)
    primarykey
    data
    text
    <p>I am developing a simple sample appication that use Hibernate to implementa a DAO that execute some <strong>CRUD</strong> operation on a database table.</p> <p>My application work fine but I have a doubt that probably is connected to a my persona gap in the use of Java.</p> <p>In my application architecture I have an <strong>interface</strong> named <strong>HibernateDAO</strong> in which I only declare the CRUD method that I would have, this one:</p> <pre><code>package org.andrea.myH8.myH8HelloWorld; public interface HibernateDAO { // Operazione di CREATE: public Integer addEmployee(String fname, String lname, int salary); // Operazione di READ: public void listEmployees(); // Operazione di UPDATE: public void updateEmployee(Integer EmployeeID, int salary); // Operazione di DELETE: public void deleteEmployee(Integer EmployeeID); } </code></pre> <p>Then I have the <strong>concrete class</strong> the implement the previouse interface and this class is named <strong>HibernateDAOImpl</strong>, this one:</p> <pre><code>package org.andrea.myH8.myH8HelloWorld; import java.util.List; import java.util.Date; import java.util.Iterator; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; // Classe principale contenente il metodo main(): public class HibernateDAOImpl implements HibernateDAO { // Factory per la creazione delle sessioni di Hibernate: private static SessionFactory factory; /** Registratore di servizzi che contiene, gestisce e fornisce l'accesso * ai servizzi registrati: */ private static ServiceRegistry serviceRegistry; public HibernateDAOImpl() { try { /** Un'istanza di Configuration consente all'applicazione di specificare le * proprietà ed il documento di mapping tra oggetti da persistere e dabelle * che devono essere utilizzati durante la creazione di una SessionFactory */ Configuration configuration = new Configuration(); /** Per la configurazione di Hibernate utilizza le proprietà specificate nel * file XML di configurazione avente nome standard hibernate.cfg.xml: */ configuration.configure(); /** ServiceRegistry crea un'istanza di ServiceRegistry (il registratore di servizzi) * alla quale vengono applicati un gruppo di settaggi contenuti dentro le proprietà * dell'oggetto configuration. * Infine il registratore di Service creato viene costruito in base a tutte le * impostazioni specificate. */ serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); /** Crea l'istanza della SessionFactory usando le proprietà ed i mapping * definiti in questa configurazione */ factory = configuration.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { // Se viene sollevata un'eccezione la gestisce System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } } /** Metodo relativo all'operazione CREATE di un record nella tabella EMPLOYEE: * * @param fname nome * @param lname cognome * @param salary salario * @return l'identificativo intero univoco che rappresenta l'impiegato */ public Integer addEmployee(String fname, String lname, int salary) { // Crea e mette nella connection pool la connessione JDBC: Session session = factory.openSession(); Transaction tx = null; // Rappresenta una transazione Integer employeeID = null; // Identificativo univoco impiegato try { // Inizia un'unità di lavoro e ritorna la transazione ad essa associata: tx = session.beginTransaction(); // Crea un nuovo oggetto Employee: Employee employee = new Employee(fname, lname, salary); /** Persiste l'istanza transiente data ed in primo luogo gli assegna * un identificatore univoco autogenerato */ employeeID = (Integer) session.save(employee); tx.commit(); // Esegue la commit della transazione } catch (HibernateException e) { // Se viene sollevata un'eccezione: if (tx != null) // Se la transazione non è nulla tx.rollback(); // Esegue la rollback e riporta alla situazione iniziale e.printStackTrace(); } finally { // Alla fine: // Chiude la sessione rilasciando la connessione JDBC e facendo il cleanup: session.close(); } return employeeID; } /* Metodo usato per elencare tutti i record presenti nella tabella EMPLOYEE: */ public void listEmployees() { // Crea e mette nella connection pool la connessione JDBC: Session session = factory.openSession(); Transaction tx = null; // Rappresenta una transazione try { // Inizia un'unità di lavoro e ritorna la transazione ad essa associata: tx = session.beginTransaction(); /** Crea la query usando una stringa HQL per ottenere tutti i record * ed ottiene la lista di tutti i record rappresentati ognuno da un * oggetto Employee */ List employees = session.createQuery("FROM Employee").list(); // Stampa i valori delle proprietà di ogni oggett nella lista: for (Iterator iterator = employees.iterator(); iterator.hasNext();) { Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); } tx.commit(); // Esegue la commit della transazione } catch (HibernateException e) { // Se viene sollevata un'eccezione: if (tx != null) // Se la transazione non è nulla tx.rollback(); // Esegue la rollback e riporta alla situazione iniziale e.printStackTrace(); } finally { // Alla fine: // Chiude la sessione rilasciando la connessione JDBC e facendo il cleanup: session.close(); } } /** Metodo che aggiorna il salario di un impiegato * * @param EmployeeID l'ID univoco che identifica il record nella tabella EMPLOYEE * @param salary il nuovo salario dell'impiegato rappresentato dal record */ public void updateEmployee(Integer EmployeeID, int salary) { // Crea e mette nella connection pool la connessione JDBC: Session session = factory.openSession(); Transaction tx = null; // Rappresenta una transazione try { // Inizia un'unità di lavoro e ritorna la transazione ad essa associata: tx = session.beginTransaction(); /** * Ritorna l'istanza persistita sul database della classe fornita come * parametro di input avente l'identificatore fornito come parametro * di input. Se non esiste un tale oggetto persistito nel database * allora ritorna null. */ Employee employee = (Employee) session.get(Employee.class, EmployeeID); employee.setSalary(salary); // Setta il nuovo valore del salario session.update(employee); // Esegue l'update di tale oggetto tx.commit(); // Esegue la commit della transazione } catch (HibernateException e) { // Se viene sollevata un'eccezione: if (tx != null) // Se la transazione non è nulla tx.rollback(); // Esegue la rollback e riporta alla situazione iniziale e.printStackTrace(); } finally { // Alla fine: // Chiude la sessione rilasciando la connessione JDBC e facendo il cleanup: session.close(); } } /** Metodo che elimina un record dalla tabella EMPOLYEE * * @param EmployeeID l'ID univoco che identifica il record nella tabella EMPLOYEE */ public void deleteEmployee(Integer EmployeeID) { // Crea e mette nella connection pool la connessione JDBC: Session session = factory.openSession(); Transaction tx = null; // Rappresenta una transazione try { // Inizia un'unità di lavoro e ritorna la transazione ad essa associata: tx = session.beginTransaction(); /** * Ritorna l'istanza persistita sul database della classe fornita come * parametro di input avente l'identificatore fornito come parametro * di input. Se non esiste un tale oggetto persistito nel database * allora ritorna null. */ Employee employee = (Employee) session.get(Employee.class, EmployeeID); session.delete(employee); // Rimuove l'oggetto dalla tabella del database: tx.commit(); // Esegue la commit della transazione } catch (HibernateException e) { // Se viene sollevata un'eccezione: if (tx != null) // Se la transazione non è nulla tx.rollback(); // Esegue la rollback e riporta alla situazione iniziale e.printStackTrace(); } finally { // Alla fine: // Chiude la sessione rilasciando la connessione JDBC e facendo il cleanup: session.close(); } } } </code></pre> <p>Ok, omitting the entity class Person, the last class it the <strong>MainApp</strong> class that contain the main() method that I use to test how this class work:</p> <p>package org.andrea.myH8.myH8HelloWorld;</p> <p>public class MainApp {</p> <pre><code>public static void main(String[] args) { // Creo una nuova istanza dell'oggetto DAO per interagire con il database: HibernateDAO ME = new HibernateDAOImpl(); System.out.println("CREAZIONE DEI RECORD:"); // Inserisce 3 record nella tabella EMPLOYEE sul DB: Integer empID1 = ME.addEmployee("Zara", "Ali", 1000); Integer empID2 = ME.addEmployee("Daisy", "Das", 5000); Integer empID3 = ME.addEmployee("John", "Paul", 10000); // Elenca tutti i record della tabella EMPLOYEE: System.out.println("ELENCA TUTTI I RECORD:"); ME.listEmployees(); // Update del record avente id corrispondente al valore della variabile empID1 System.out.println("Update del record avente id corrispondente al valore: " + empID1); ME.updateEmployee(empID1, 5000); /* Elimina dalla tabella EMPLOYEE il record avente id corrispondente al valore * della variabile empID2 */ System.out.println("Eliminazione del record avente id corrispondente al valore: " + empID2); ME.deleteEmployee(empID2); // Elenca tutti i record della tabella EMPLOYEE: System.out.println("ELENCA TUTTI I RECORD:"); ME.listEmployees(); } </code></pre> <p>}</p> <p>Now I have a doubt about this last class...in the <strong>main()</strong> method of this class I declare my DAO Object as the interface type (<strong>HibernateDAO</strong>) but I have to construct it using the concrete type that implement this interface (<strong>HibernateDAOImpl</strong>), in this way:</p> <pre><code>HibernateDAO ME = new HibernateDAOImpl(); </code></pre> <p>I would know if this is the best practice that I have to use or if exist some better way to say Java to create it as HibernateDAO type and then, automatically, is Java that automatically detect that I have only an implementation and use it.</p> <p>Can you explain me this thing?</p> <p>Tnx</p> <p>Andrea</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload