【问题标题】:How to implement GenericDAO class on Hibernate如何在 Hibernate 上实现 GenericDAO 类
【发布时间】:2016-04-13 07:48:03
【问题描述】:

我希望 UserDao 类扩展 GenericDAO,我将在其中拥有所有 CRUD 方法。我已阅读 IBM 的文章:http://www.ibm.com/developerworks/java/library/j-genericdao/index.html,但我无法实现它。有人可以根据我的自定义 UserDao 类向我展示示例吗?

@Transactional(value="myTransactionManager")
public class UserDao {

    @Qualifier("mySessionFactory")
    public SessionFactoryImpl sessionFactory;

    public void setSessionFactory(SessionFactoryImpl sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public List<UserEntity> getAll() {
        Query query = sessionFactory.getCurrentSession().createQuery(
                "from UserEntity ");
        List<UserEntity> userList = query.list();
        return userList;
    }

    public void updaet(UserEntity userEntity) {
        sessionFactory.getCurrentSession().update(userEntity);
    }

    public void delete(UserEntity userEntity) {
        sessionFactory.getCurrentSession().delete(userEntity);
    }

    public void save(UserEntity userEntity) {
        sessionFactory.getCurrentSession().save(userEntity);
    }

}

我试着写这样的课

public class GenericDao{

    @Qualifier("mySessionFactory")
    public SessionFactoryImpl sessionFactory;

    public void setSessionFactory(SessionFactoryImpl sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public <T> List<T> getAll(Class<T> t) {
        Query query = sessionFactory.getCurrentSession().createQuery(
                "from " + t.getName());
        List<T> list = query.list();
        return list;
    }

    public <T> void save(T t) {
        sessionFactory.getCurrentSession().save(t);
    }

    public <T> void update(T t) {
        sessionFactory.getCurrentSession().update(t);
    }

    public <T> void delete(T t) {
        sessionFactory.getCurrentSession().delete(t);
    }
}

但是当我尝试像这样使用 UserDao 提取数据时:

public List<UserEntity> getAll() {
    List<UserEntity> list = UserDao.findAll();
}

List&lt;UserEntity&gt; list = UserDao.findAll(); 行的 Eclipse IDE 给出错误:方法 findAll() 对于 UserDao 类型的定义不足。

【问题讨论】:

  • 你需要将类型传递给GenericDao,GenericDao&lt;T&gt;并扩展它,显然......
  • UserDao不扩展GenericDao您没有将泛型添加到类定义中。 GenericDao &lt;T, PK extends Serializable&gt;
  • UserDao 在描述中没有扩展 GenericDao。但是当我扩展它时,它会给出描述的错误。

标签: java hibernate generics


【解决方案1】:

这是我的实现:

通用道:

@Repository
public class GenericDao<T extends DbObject> {

    @Autowired
    private SessionFactory sessionFactory;

    private Class<T> getParameterizedClass() {
        return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public T findById(final Serializable id) {
        return (T) getCurrentSession().get(getParameterizedClass(), id.toString());
    }

    public void persist(final T object) {
        getCurrentSession().persist(object);
    }

    public void saveOrUpdate(final T object) {
        getCurrentSession().saveOrUpdate(object);
    }

    public void delete(final T object) {
        getCurrentSession().delete(object);
    }

    public T merge(final T object) {
        return (T) getCurrentSession().merge(object);
    }

}

用户道:

public class UserDao extends GenericDao<User> {

}

实体:

@Entity
@Table(name = "...")    
public class User extends DbObject {
}

【讨论】:

  • 这个方法的用途:private Class getParameterizedClass() { return (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; }
猜你喜欢
  • 2017-11-15
  • 2015-10-09
  • 1970-01-01
  • 2021-08-16
  • 2011-02-21
  • 2023-03-08
  • 1970-01-01
  • 2022-12-14
  • 2013-12-31
相关资源
最近更新 更多