Пишите меньше DAO с помощью Spring Hibernate, используя аннотации - PullRequest
5 голосов
/ 23 ноября 2011

Файлы конфигурации My Spring + Hibernate небольшие и очень компактные.Я использую автоматическое сканирование, чтобы найти свои модели сущностей / daos.

Я не хочу писать DAO + DAOImpl для КАЖДОЙ сущности в моей иерархии.

Некоторые из них могут претендовать на получение своихсобственные, например, если они имеют сложные отношения с другими объектами и требуют больше, чем базовая функциональность CRUD.Но в остальном ...

Есть ли способ обойти стандарт defacto?

Скажем, что-то вроде общего DAO, например:

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

Тогда я могу сделать что-то вроде

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

Возможно ли это с аннотациями?Я не хочу ничего настраивать в xml.Если я не могу сделать выше, возможно ли все еще иметь один GenericDaoImpl.java с чем-то вроде:

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

, а затем

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

Это практично вообще?

Ответы [ 3 ]

5 голосов
/ 23 ноября 2011

Используя дженерики, вы можете попробовать что-то вроде этого:

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

}

Содержание может быть другим, но общая идея применима.

После этого вы сможете автоматически подключить DAOв вашем контроллере и классы обслуживания с помощью

@Autowired
private GenericDAO<Car> carDao;
2 голосов
/ 23 ноября 2011

Вы можете комбинировать Spring / Hibernate с JPA , который предоставляет EntityManager для большого количества базовых постоянных задач:

@Service
public class CarService {

    @PersistenceContext
    private EntityManager em;

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

Он также будет обрабатывать транзакции и простые запросы без необходимости писать DAO. Для более сложных операций вы все равно можете написать DAO и использовать SessionFactory в Hibernate (хотя JPA и здесь вариант).

Некоторые учебные пособия предполагают, что вы все равно должны написать DAO для абстракции JPA-системы. Тем не менее, я лично нашел это ненужным (JPA имеет очень малую площадь интеграции), и фактически это также способ, которым Spring Roo имеет дело со слоем данных за сценой.

1 голос
/ 03 ноября 2014

Вы пытались использовать Spring Data .Я хочу сказать, Spring JPA , где вы можете использовать репозитории.

...