Java 在GenericDao中设置类的替代方法
我看到了Hibernate Dao的泛型。内容如下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 ){
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类。IGenericDao谢谢。我也遇到了同样的问题,但不幸的是,我找不到一个干净的解决方案,我只是在AbstractHibernateDao中添加了一个抽象函数,它迫使开发人员重写类所使用的函数,这样他们就不会忘记错误地设置类