2011-11-22 13 views
5

Moje pliki konfiguracyjne Spring + Hibernate są małe i bardzo szczelne. Korzystam z automatycznego skanowania, aby znaleźć moje modelowe jednostki/daos.Pisz mniej DAO ze Spring Hibernate za pomocą adnotacji

Nie chcę pisać DAO + DAOImpl dla KAŻDEJ jednostki w mojej hierarchii.

Niektóre z nich mogą kwalifikować się do własnych, np. Jeśli mają złożone relacje z innymi podmiotami i wymagają więcej niż podstawowej funkcjonalności CRUD. Ale do końca ...

Czy istnieje sposób na obejście normy defacto?

Powiedz coś rodzajowe DAO, ex:

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

Wtedy mogę zrobić coś

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

Czy to możliwe, z adnotacjami? Nie chcę niczego konfigurować w xml. Jeśli nie mogę zrobić powyżej, jest to nadal możliwe, aby jeden GenericDaoImpl.java z czymś takim:

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

a następnie

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

Jest to praktyczne w ogóle?

Odpowiedz

5

Korzystanie rodzajowych, możesz spróbować czegoś takiego:

@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); 
    } 

} 

Zawartość może być różna, ale ogólna idea ma zastosowanie.

Powinieneś móc następnie autowire DAO w klasach kontrolerów i usług za pomocą

@Autowired 
private GenericDAO<Car> carDao; 
+0

Podoba mi się ten pomysł, ale czy to działa? Spodziewalibyśmy się, że wymazanie kodu doprowadziłoby do duplikowania definicji komponentu bean, ale nie sprawdziliśmy tego ... – seanhodges

+1

Przeszukując, wygląda na to, że możesz wyminąć usuwanie przy użyciu interfejsów podrzędnych: http: // stackoverflow.com/questions/502994/spring-ioc-and-generic-interface-type – seanhodges

+0

Aby wyjaśnić, Autowyred na SessionFactory będzie automatycznie wyposażyć Hibernate's SessionFactory na wiosnę, prawda? Ale co jeśli mój CustomHibernateDaoSupport rozszerza org.springframework.orm.hibernate3.support.HibernateDaoSupport o metodę Autowired która wywołuje setSessionFactory (sessionFactory). Więc domyślnie inne sesje dao są tak skonfigurowane, aby automatycznie zarządzały wiosną ... Czy te wielokrotne "sesje" narzucałyby problemy z wydajnością? – sloven

2

Można łączyć Spring/Hibernate with JPA, który dostarcza EntityManager dla dużej ilości podstawowych zadań trwałość:

@Service 
public class CarService { 

    @PersistenceContext 
    private EntityManager em; 

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

Będzie również obsługiwać transakcje i proste zapytania bez potrzeby pisania DAO. W przypadku bardziej złożonych operacji nadal można napisać DAO i powrócić do Hibernate's SessionFactory (chociaż JPA także jest tutaj również).

Niektóre samouczki sugerują, że powinieneś jeszcze napisać DAO o streszczenie instalacji hydraulicznej WZP. Jednak osobiście uznałem to za niepotrzebne (JPA ma bardzo mały ślad integracyjny), a w rzeczywistości jest to również sposób, w jaki Spring Roo zajmuje się warstwą danych za kulisami.

1

Czy próbowałeś użyć danych sprężynowych. Mam na myśli Spring JPA, w którym można korzystać z repozytoriów.
Możesz wyeliminować zapisywanie wszystkich materiałów dla każdej jednostki.

Powiązane problemy