Ho trovato alcuni tutorial su come creare un DAO Hibernate con generici, ma tutti usano EntityManager
anziché SessionFactory
. La mia domanda è come costruire un DAO con generici usando SessionFactory
. Ho il seguito finora:Come implementare Hobernate DAO con generici
Interfaccia:
public interface GenericDao<T> {
public void save(T obj);
public void update(T obj);
public void delete(T obj);
public T findById(long id);
}
Classe:
@Repository
public class GenericDaoImpl<T> implements GenericDao<T> {
@Autowired
private SessionFactory sessionFactory;
public void save(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void update(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.update(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void delete(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.delete(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public T findById(long id) {
// ??
return null;
}
io sono sicuro di come fare per findById
utilizzando farmaci generici. Credo che gli altri metodi siano giusti, ma correggimi se sbaglio.
DOMANDA LATERALE: L'utilizzo di EntityManager
è più vantaggioso rispetto all'utilizzo di SessionFactory
? Ho visto alcuni post sull'argomento, ma vorrei qualche altra opinione.
In Java, i generici vengono implementati dalla cancellazione e il parametro di tipo formale 'T' diventa' Oggetto' in fase di esecuzione. In altre parole, in fase di esecuzione, il tipo "T" non esiste. Qualsiasi metodo generico che restituisca un'istanza 'T' appena coniata richiederà quindi un token di tipo run time che il metodo può utilizzare per determinare in modo riflessivo il tipo di istanza che dovrà creare. Una firma più pratica per 'findById (...)' è quindi 'public T findById (classe class, long id)'. –
scottb
@scottb quindi verrà utilizzato il token Classe per determinare quale tipo di oggetto deve essere restituito dal metodo? Come potrei fare esattamente questo?Con gli esempi di 'EntityManager', ho visto' entityManager.find (type.class, id); 'ma non sono sicuro di come farlo con' SessionFactory'. –
Se il tipo che è necessario restituire ha un costruttore senza argomenti, allora il modo più semplice per dinamicamente una nuova istanza di un tipo arbitrario 'T' sarebbe utilizzare il metodo' newInstance() 'di' Classe ', per esempio. 'T myObj = class.newInstance();'. In caso contrario, potrebbe essere necessario utilizzare la riflessione tramite l'oggetto 'Classe ' per richiamare un costruttore appropriato con argomenti. In tale metodo, 'class' in' Classe class' ha il ruolo di un token * di tipo run time *. In Java, a volte sono necessari proprio perché i tipi generici non esistono in fase di esecuzione. –
scottb