2011-11-22 17 views
5

I file di configurazione di Spring + Hibernate sono piccoli e molto resistenti. Uso la scansione automatica per trovare le entità/i miei modelli.Scrive meno DAO con Spring Hibernate utilizzando le annotazioni

Non voglio dover scrivere DAO + DAOImpl per OGNI entità nella mia gerarchia.

Alcuni possono qualificarsi come propri, ad esempio se hanno relazioni complesse con altre entità e richiedono più funzionalità CRUD di base. Ma per il resto ...

C'è un modo per aggirare lo standard defacto?

Di ', qualcosa come un DAO generica, es:

http://www.ibm.com/developerworks/java/library/j-genericdao/index.html

Allora posso fare qualcosa di simile

GenericDao dao = appContext.getBean("genericDao"); 
    dao.save(car);    
    dao.save(lease); 

Questo è possibile con annotazioni? Non voglio dover configurare nulla in xml. Se non riesco a fare sopra, è ancora possibile avere uno GenericDaoImpl.java con qualcosa di simile:

@Repository("carDao") 
@Repository("leaseDao") 
class GenericDaoImpl extends CustomHibernateDaoSupport implements GenericDao { 
... 
} 

e poi

GenericDao dao = appContext.getBean("carDao"); 
    dao.save(car);    
    dao = appContext.getBean("leaseDao"); //carDao is garbage coll. 
    dao.save(lease); 

È questo pratico a tutti?

risposta

5

Utilizzando farmaci generici, si potrebbe provare qualcosa di simile:

@Repository 
@Transactional 
public class GenericDAOImpl<T> implements GenericDAO<T> { 

    @Autowired 
    private SessionFactory factory; 

    public void persist(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.persist(entity); 
    } 

    @SuppressWarnings("unchecked") 
    public T merge(T entity) { 
     Session session = factory.getCurrentSession(); 
     return (T) session.merge(entity); 
    } 

    public void saveOrUpdate(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.saveOrUpdate(entity); 
    } 

    public void delete(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.delete(entity); 
    } 

} 

Il contenuto può essere diversa, ma l'idea generale è applicabile.

Si dovrebbe essere in grado di poi autowire DAO nel controller e di servizio classi utilizzando

@Autowired 
private GenericDAO<Car> carDao; 
+0

Mi piace questa idea, ma funziona? Mi aspetterei che la cancellazione di un tipo porterebbe a una definizione di bean duplicata, ma non l'ho verificato ... – seanhodges

+1

Cercando in giro, sembra che si possa aggirare la cancellazione usando sub-interfacce: http: // StackOverflow.it/questions/502994/spring-ioc-and-generic-interface-type – seanhodges

+0

Giusto per chiarire, Autowired su SessionFactory autowire SessionFactory di Hibernate in primavera, giusto? Ma cosa succede se il mio CustomHibernateDaoSupport estende org.springframework.orm.hibernate3.support.HibernateDao Support con un metodo Autowired che chiama setSessionFactory (sessionFactory). Quindi, per impostazione predefinita, le altre sessioni di dao sono configurate per essere automaticamente gestite da Spring ... Queste "sessioni" multiple impongono problemi di prestazioni? – sloven

2

È possibile combinare Spring/Hibernate with JPA, che fornisce l'EntityManager per una grande quantità di compiti di persistenza di base:

@Service 
public class CarService { 

    @PersistenceContext 
    private EntityManager em; 

    public void saveCarAndLease(Car car, Lease lease) { 
     em.persist(car); 
     em.persist(lease); 
    } 
} 

Gestirà anche le transazioni e le query semplici senza dover scrivere un DAO. Per le operazioni più complesse, puoi ancora scrivere un DAO e tornare a SessionFactory di Hibernate (anche se JPA è un'opzione anche qui).

Alcuni tutorial suggeriscono che si dovrebbe ancora scrivere il DAO per l'astrazione dell'impianto idraulico JPA. Tuttavia, ho personalmente trovato questo non necessario (JPA ha un ingombro di integrazione molto piccolo), e in effetti questo è anche il modo in cui lo Spring Roo si occupa del livello dati dietro le quinte.

1

Hai provato a utilizzare Dati di primavera. Intendo dire Spring JPA in cui è possibile utilizzare i repository.
È possibile eliminare la scrittura di tutti gli elementi per ciascuna entità.

Problemi correlati