これが私の一般的なdaoのスニペットであり、各サービスレイヤークラスに挿入します。
@Component("Dao")
public class Dao implements IDao {
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;
@Override
public <T> T save(final T o){
return (T) sessionFactory.getCurrentSession().save(o);
}
@Override
public void delete(final Object object) {
sessionFactory.getCurrentSession().delete(object);
}
@Override
public <T> T get(final Class<T> type, final Long id) {
return (T) sessionFactory.getCurrentSession().get(type, id);
}
@Override
public <T> List<T> getFieldsEq(final Class<T> type, final Map<String, Object> restrictions) {
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(type);
for (Map.Entry<String, Object> entry : restrictions.entrySet()) {
crit.add(Restrictions.eq(entry.getKey(), entry.getValue()));
}
return crit.list();
}
}
次のように、サービスレイヤーで使用できるのはどれですか。
@Transactional(readOnly = true)
public List<City> getCities() {
return dao.getAll(City.class);
}
そしてもちろん、特定の複雑なクエリに対してdaoを拡張することもできます。1つの一般的なdaoを持つことは、単一責任の原則であるDRYに従い、テストを容易にします。トランザクションはサービスレイヤー上にあり、作業単位に直接関連している必要があります。