在GenericDao中设置Class的另一种方法

时间:2014-12-09 05:42:09

标签: java spring hibernate

我看到Hibernate Dao的this泛型。见内容。

public abstract class AbstractHibernateDao< T extends Serializable > {

   private Class< T > clazz;

   @Autowired
   SessionFactory sessionFactory;

   public final void setClazz( Class< T > clazzToSet ){
      this.clazz = clazzToSet;
   }

   public T findOne( long id ){
      return (T) getCurrentSession().get( clazz, id );
   }
   public List< T > findAll(){
      return getCurrentSession().createQuery( "from " + clazz.getName() ).list();
   }

   public void create( T entity ){
      getCurrentSession().persist( entity );
   }

   public void update( T entity ){
      getCurrentSession().merge( entity );
   }

   public void delete( T entity ){
      getCurrentSession().delete( entity );
   }
   public void deleteById( long entityId ){
      T entity = findOne( entityId );
      delete( entity );
   }

   protected final Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}

然后是GenericDao

@Repository
@Scope( BeanDefinition.SCOPE_PROTOTYPE )
public class GenericHibernateDao< T extends Serializable >
  extends AbstractHibernateDao< T > implements IGenericDao< T >{
   //
}

然后是服务实施

@Service
class FooService implements IFooService{

   IGenericDao< Foo > dao;

   @Autowired
   public void setDao( IGenericDao< Foo > daoToSet ){
      dao = daoToSet;
      dao.setClazz( Foo.class );
   }

   // ...

}

我不喜欢调用setClazz方法所需的方式,只是为了传递类。还有另一种方法吗?或者有没有办法在&lt;&gt;内调用Foo类。 IGenericDao&LT; Foo&gt;道;

感谢。

1 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题,但不幸的是我找不到一个干净的解决方案我只在AbstractHibernateDao中添加了一个抽象函数,它强制开发人员覆盖类的功能,这样他们就不会忘记错误地设置类。