Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在组件扫描中添加属性_Java_Spring_Hibernate - Fatal编程技术网

Java 在组件扫描中添加属性

Java 在组件扫描中添加属性,java,spring,hibernate,Java,Spring,Hibernate,我们在项目中有很多DAO以及它们自己的实现。例如,我有一个名为CorDAO和CorDAOHibernate的类(CorDAO是一个接口,CorDAOHibernate实现了CorDAO)。对于每个接口,我需要执行以下操作: <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <pr

我们在项目中有很多DAO以及它们自己的实现。例如,我有一个名为CorDAO和CorDAOHibernate的类(CorDAO是一个接口,CorDAOHibernate实现了CorDAO)。对于每个接口,我需要执行以下操作:

    <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
    }