Java 在组件扫描中添加属性
我们在项目中有很多DAO以及它们自己的实现。例如,我有一个名为CorDAO和CorDAOHibernate的类(CorDAO是一个接口,CorDAOHibernate实现了CorDAO)。对于每个接口,我需要执行以下操作:Java 在组件扫描中添加属性,java,spring,hibernate,Java,Spring,Hibernate,我们在项目中有很多DAO以及它们自己的实现。例如,我有一个名为CorDAO和CorDAOHibernate的类(CorDAO是一个接口,CorDAOHibernate实现了CorDAO)。对于每个接口,我需要执行以下操作: <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <pr
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.myproject.*.to"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
</props>
</property>
</bean>
<bean id="genericDAO" class="com.myproject.dao.hibernate.GenericDAOHibernate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="CorDAO" class="com.myproject.dao.hibernate.CorDAOHibernate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="ExampleDAO" class="com.myproject.dao.hibernate.ExampleDAOHibernate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
我认为这是因为sessionFactory在GenericDAOHibernate中是自动连接的,但在CorDAOHibernate中是空的。如何使用组件扫描解决此问题
班级
科尔道
冬眠
@Component
public class CorDAOHibernate extends GenericDAOHibernate implements CorDAO {
//Methods
}
@Component
public class GenericDAOHibernate extends HibernateDaoSupport implements GenericDAO, PropertySelector {
@Autowired
private SessionFactory sessionFactory;
protected Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
//Methods
}
通用刀
public interface GenericDAO extends DAO {
//Methods. This class doesn't contains @Repository annotation
}
一般冬眠
@Component
public class CorDAOHibernate extends GenericDAOHibernate implements CorDAO {
//Methods
}
@Component
public class GenericDAOHibernate extends HibernateDaoSupport implements GenericDAO, PropertySelector {
@Autowired
private SessionFactory sessionFactory;
protected Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
//Methods
}
刀
另外,添加@Component(“genericDAO”)我得到了(可能是因为继承问题):
NoniqueBeandDefinitionException:没有定义[com.myproject.dao.GenericDAO]类型的合格bean:需要单个匹配bean,但找到88个您必须将声明为sessionFactory
的类注释为@bean(或@Component,请参阅并确保将通过ComponentScan对其进行扫描)
也考虑使用Spring数据的方法,而不必编写样板代码。
嗯,你的主要问题是因为:
调用init方法失败;嵌套异常为java.lang.IllegalArgumentException:“sessionFactory”或“hibernateTemplate”是必需的
我也回答了一个类似的问题
长话短说,您的GenericDAOHibernate
以错误的方式实现:
无需将SessionFactory
作为HibernateDaoSupport
内部实现,您可以通过调用getSessionFactory()
您必须通过构造函数将SessionFactory
传递给HibernateDaoSupport
,以便在HibernateDaoSupport
中初始化HibernateTemplate
。否则,它将为null,因此发生此异常消息
另外,您的@Repository
和@Component
似乎也被注释得很笨拙。基本上,我只会将@Repository
用于DAO。它与@Component
加上spring”功能相同
无论如何,请尝试更改为以下内容:
@Repository
public class GenericDAOHibernate extends HibernateDaoSupport implements GenericDAO, PropertySelector {
@Autowired
public GenericDAOHibernate(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
protected Session getCurrentSession() {
return getSessionFactory().getCurrentSession();
}
}
以及每个DAO实现:
@Repository
public class CorDAOHibernate extends GenericDAOHibernate implements CorDAO {
public CorDAOHibernate(SessionFactory sessionFactory) {
super(sessionFactory);
}
}
另外,从CorDAO
界面中删除@Repository
,并删除@组件(“genericDAO”)
内容……我认为您应该删除
@自动连线
私人会话工厂会话工厂
场
因为sessionFactory字段已经在父类中定义。并且setSessionFactory方法已被取消清除为final。所以您不需要取消清除sessionFactory的新私有字段
下面是setSessionFactory方法的实现
/**
* Set the Hibernate SessionFactory to be used by this DAO.
* Will automatically create a HibernateTemplate for the given SessionFactory.
* @see #createHibernateTemplate
* @see #setHibernateTemplate
*/
public final void setSessionFactory(SessionFactory sessionFactory) {
if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
this.hibernateTemplate = createHibernateTemplate(sessionFactory);
}
}
删除sessionFactory和getCurrentSession(HibernateDaoSupport已具有currentSession()方法)
或按如下方式更改getCurrentSession
public class GenericDAOHibernate extends HibernateDaoSupport implements GenericDAO, PropertySelector {
protected Session getCurrentSession() throws DataAccessResourceFailureException {
return currentSession()
}
//Methods
}
你能发布一个CorDAOHibernate的例子吗?谢谢,所以你需要在你的GenericDAOHibernate类中去掉sessionFactory字段。它扩展了HibernateDaoSupport,它已经存在了。子类是否可以访问私有sessionFactory sessionFactory字段?如果是,请添加它的实现方式。如果是像GenericDAOHib这样的具体类ernate
无法访问此域可能是个问题,CorDAOHibernate
的构造函数是什么?(你知道,@Bean/@Component/etc
需要零参数或自动连接构造函数!?)第二个错误消息非常奇怪:你定义了88个GenericDao
“beans”!?她已经提到@Component被分配到类中,正如您所看到的,Component scan也被打开了。@SergeyProkofiev好吧,我没有看到更新。对不起
/**
* Set the Hibernate SessionFactory to be used by this DAO.
* Will automatically create a HibernateTemplate for the given SessionFactory.
* @see #createHibernateTemplate
* @see #setHibernateTemplate
*/
public final void setSessionFactory(SessionFactory sessionFactory) {
if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
this.hibernateTemplate = createHibernateTemplate(sessionFactory);
}
}
public class GenericDAOHibernate extends HibernateDaoSupport implements GenericDAO, PropertySelector {
protected Session getCurrentSession() throws DataAccessResourceFailureException {
return currentSession()
}
//Methods
}