各位好!
黎活明老师讲的巴巴运动网大家不知道了解不?最近我在看这个视频。黎老师是用struts+spring+JPA来进行开发的。
其中有一个抽象类DaoSupport<T>用到了比较精巧的方式就是以后所有的DaoImpl都不需要写实体的处理方法,只需要继承DaoSupport<T>,并指明这个T的具体类型就可以了。我想用hibernate来实现,可思考了会,感觉实现不了。不知道大家有没有建议。DaoSupport<T>的代码如下:
package cn.itcast.service.base;import java.io.Serializable;import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import cn.itcast.utils.GenericsUtils;@SuppressWarnings("unchecked")
@Transactional
public abstract class DaoSupport<T> implements DAO<T> {
@PersistenceContext protected EntityManager em;
/* 实体类 */
protected Class<T> entityClass = GenericsUtils.getSuperClassGenricType(getClass());

public void delete(Serializable entityid) {
em.remove(em.getReference(entityClass, entityid));
} @Transactional(propagation=Propagation.NOT_SUPPORTED)
public T find(Serializable entityid) {
return em.find(entityClass, entityid);
}

@Transactional(propagation=Propagation.NOT_SUPPORTED)
public long getCount() {
return (Long)em.createQuery("select count(o) from " + getEntityName(this.entityClass) + " o").getSingleResult();
}
/**
 * 获取实体名称
 * @return
 */
protected static <E> String getEntityName(Class<E> entityClass){
String entityName = entityClass.getSimpleName();
Entity entity = entityClass.getAnnotation(Entity.class);
if(entity.name()!=null && !"".equals(entity.name())) entityName = entity.name();
return entityName;
} public void save(T entity) {
em.persist(entity);
} public void update(T entity) {
em.merge(entity);
}}

解决方案 »

  1.   

    JPA是一规范,hibernate3.2是实现了JPA的据说
      

  2.   

    恩,这个我知道,但两者使用起来是有差异的。
    上面提到的这个类,我想直接用hibernate来实现,但好像操作起来有点困难。
    不知道大家在使用hibernate的时候是不是每个实体类的DaoImpl都需要自己写自己的实体操作方法,还是抽象一个类,来封装一些基本的方法,以实现代码复用。
      

  3.   


    一般来说都是抽象一个类,来封装一些基本的方法(CURD),以实现代码复用。
      

  4.   

    恩,能不能给我举个hibernate抽象类以实现代码复用的例子啊。好让我参考下,谢谢了。
      

  5.   

    你完全可以认为hibernate就是jpa的子集。
    jpa支持的东西hibernate就支持。只有扩冲的,没有缩水的。
    通用dao的设计都差不多都是一个思路。有影响吗?
      

  6.   

    @PersistenceContext protected EntityManager em;
    换成session注入进来不就可以了吗。
    @resource protected SessionFactory sessionFactory;<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    ......
    </bean>调用地时候通过
    sessionFactory.getCurrentSession().save(T);
      

  7.   

    所谓JPA是持久化的规范,屏蔽了数据库厂商不同带来的差异而已,至于你提到的问题hibernate完全可以做到。
      

  8.   

    这个用hibernate实现不是很正常吗。
    public class UserServiceImpl extends DaoSupport<User> implements UserService { @Override
    public void add(User t) {
    super.add(t);
    }

    public class DaoSupport<T> implements Dao<T> {
    protected Class<T> entityClass = GenericsUtils.getSuperClassGenricType(this.getClass());
    @Autowired
    protected HibernateTemplate ht;

    @Override
    public void add(T t) {
    // TODO Auto-generated method stub
    ht.save("User", t);
    }
    希望对你有用