Так мы привыкли генерировать объекты DAO на основе общей реализации DAO Impl с помощью шаблона Hibernate, предоставляемого Spring Framework.
Создание java-класса DAO с помощью ftl, а образец выглядит как
@Repository("hrdb.UserDao")
public class UserDao extends WMGenericDaoImpl <User, Integer> {
@Autowired
@Qualifier("hrdbTemplate")
private HibernateTemplate template;
public HibernateTemplate getTemplate() {
return this.template;
}
}
И вот так выглядит наш обобщенный DAO-импл
public abstract class WMGenericDaoImpl<Entity extends Serializable, Identifier extends Serializable> implements WMGenericDao<Entity, Identifier> {
private Class<Entity> entityClass;
public abstract HibernateTemplate getTemplate();
@SuppressWarnings("unchecked")
@PostConstruct
public void init() {
if (getTemplate() == null)
throw new RuntimeException("hibernate template is not set.");
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<Entity>) genericSuperclass.getActualTypeArguments()[0];
}
public Entity create(Entity entity) {
Identifier identifier = (Identifier) getTemplate().save(entity);
return findById(identifier);
}
public void update(Entity entity) {
getTemplate().update(entity);
getTemplate().flush();
}
public void delete(Entity entity) {
getTemplate().delete(entity);
}
public Entity findById(Identifier entityId) {
return getTemplate().get(entityClass, entityId);
}
}
Конечно, здесь есть интерфейс WMGenericDao,
public interface WMGenericDao<Entity, Identifier> {
Entity create(Entity entity);
void update(Entity entity);
void delete(Entity entity);
Entity findById(Identifier entityId);
}
И HibernateTemplate объявлен в spring.xml.Благодаря такой реализации мы можем сгенерировать класс All DAO в процессе обратного инжиниринга, используя шаблон гибернации, предоставленный spring.