Java 在GenericDao中设置类的替代方法

Java 在GenericDao中设置类的替代方法,java,spring,hibernate,Java,Spring,Hibernate,我看到了Hibernate Dao的泛型。内容如下 public abstract class AbstractHibernateDao< T extends Serializable > { private Class< T > clazz; @Autowired SessionFactory sessionFactory; public final void setClazz( Class< T > clazzToSet ){

我看到了Hibernate Dao的泛型。内容如下

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方法只是为了传递类的方式。还有别的办法吗?或者有没有办法在里面调用Foo类。IGenericDaodao


谢谢。

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