инструменты гибернации и шаблон гибернации в DAO - PullRequest
2 голосов
/ 02 марта 2012

Я использовал плагин Eclipse для инструментов Hibernate для генерации реализации DAO, но он использует «javax.persistence.EntityManager». Я хочу сгенерировать DAO impl на основе моего сопоставленного объекта (используя аннотации JPA), использующего шаблон Hibernate, предоставляемый Spring Framework. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 10 июля 2015

Посмотрите на TypeTools . README имеет универсальный пример DAO :

class Device {}
class Router extends Device {}

class GenericDAO<T, ID extends Serializable> {
  protected Class<T> persistentClass;
  protected Class<ID> idClass;

  private GenericDAO() {
    Class<?>[] typeArguments = TypeResolver.resolveRawArguments(GenericDAO.class, getClass());
    this.persistentClass = (Class<T>) typeArguments[0];
    this.idClass = (Class<ID>) typeArguments[1];
  }
}

class DeviceDAO<T extends Device> extends GenericDAO<T, Long> {}
class RouterDAO extends DeviceDAO<Router> {}
0 голосов
/ 06 июля 2015

Так мы привыкли генерировать объекты 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.

...