2012-03-02 23 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> {}