2012-03-02 78 views
2

我使用Hibernate工具Eclipse插件来生成DAO实现,但它使用了“javax.persistence.EntityManager”。我想基于使用Spring Framework提供的Hibernate模板的映射实体(使用JPA注释)生成DAO impl。我怎样才能做到这一点?DAO中的hibernate工具和休眠模板

+0

我在网上找到“Skyway builder”。是一个有用的工具? – observer 2012-03-02 10:57:04

+2

HibernateTemplate几乎不推荐使用(文档建议不要再使用它)。如何自己生成DAO?你会学到的不仅仅是用魔法工具为你生成它们。 – 2012-03-02 12:46:40

+0

感谢您的建议。所以我可以使用默认的EntityManager? – observer 2012-03-02 14:47:13

回答

0

这是我们如何使用Spring Framework提供的Hibernate模板来生成基于DAO Impl的通用实现的DAO对象。

生成DAO的Java类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); 
    } 
} 

Ofcourse这里是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中声明。 通过这种实现,我们可以使用Spring提供的hibernate模板,在逆向工程过程中生成所有DAO类。

0

看一看TypeTools。自述文件有一个generic 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> {}