当前位置: 首页 > 知识库问答 >
问题:

SPRING MVC - 非法参数例外:“会话工厂”或“Hibernate模板”是必需的

佟阳焱
2023-03-14

我有一个Maven项目和它的模块

父母

|_____Model

|_____坚持

     |_ persistence-context.xml

|_____服务

     |_ service-context.xml

|_____看法

     |_ spring/app-config.xml

在持久性上下文中.xml有下一个:

http://www.springframework.org/schema/beans http://www . spring framework . org/schema/beans/spring-beans-3.0 . xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" default-auto wire = " by name "

<tx:annotation-driven transaction-manager="persistence.transactionManager"  proxy-target-class="true" />

<bean id="persistence.propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath*:META-INF/jdbc.properties</value>
            <value>classpath*:META-INF/hibernate.properties</value>             
        </list>
    </property>
</bean>

<bean id="persistence.transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="persistence.sessionFactory" />
    <property name="jdbcExceptionTranslator" ref="persistence.jdbcExceptionTranslator" />
</bean>

<bean name="persistence.jdbcExceptionTranslator" class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
    <constructor-arg>
        <ref bean="persistence.dataSource" />
    </constructor-arg>
</bean>

<bean id="persistence.dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.db.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="defaultAutoCommit" value="false" />
    <property name="poolPreparedStatements" value="true" />
    <property name="initialSize" value="20" />
    <property name="maxActive" value="30" />
    <property name="maxIdle" value="25" />
</bean>

<bean id="persistence.sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="persistence.dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
            <prop key="hibernate.connection.autocommit">false</prop>
            <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop>
        </props>
    </property>
    <property name="mappingLocations">
        <list>
            <value>classpath:mappings/items/servicio.hbm.xml</value>
            <value>classpath:mappings/items/stockable.hbm.xml</value>   
            <value>classpath:mappings/items/bigstockable.hbm.xml</value>        
        </list>
    </property>
</bean>

<!-- Daos beans -->

<bean id="servicioDao" class="daos.ServicioDao" >
    <property name="sessionFactory" ref="persistence.sessionFactory" />
</bean>
<bean id="stockableDao" class="daos.StockableDao" >
    <property name="sessionFactory" ref="persistence.sessionFactory" />
</bean>
<bean id="bigStockableDao" class="daos.BigStockableDao" >
    <property name="sessionFactory" ref="persistence.sessionFactory" />
</bean>

在那个xml中,我用它做我的 daos 会话工厂,但是当我启动项目时,我得到了 java.lang.非法描述例外:“会话工厂”或“Hibernate模板”是必需的,因为我的Hibernate模板是空的。我的 daos 从Hibernate道支持扩展而来,我知道如果你给你的 dao 一个会话工厂,它将自动创建一个Hibernate模板,并 idk 可能发生的事情。

我的DAO有一个@Repository(例如,@repositoryvalue=“servicioDao”))

以及设置器中带有@Autow的@Service服务

我正在将它们添加到连接中

   <context:component-scan base-package="controllers" />
   <context:component-scan base-package="servicios" />
   <context:component-scan base-package="daos" />

我只是将它添加到persistence-context.xml中

<!-- Daos beans -->

<bean id="servicioDao" class="daos.ServicioDao" >
    <property name="sessionFactory" ref="persistence.sessionFactory" />
    <property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="stockableDao" class="daos.StockableDao" >
    <property name="sessionFactory" ref="persistence.sessionFactory" />
    <property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="bigStockableDao" class="daos.BigStockableDao" >
    <property name="sessionFactory" ref="persistence.sessionFactory" />
    <property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>

我得到同样的错误。

我的一些daos代码:

@Repository(value="servicioDao")
@SuppressWarnings("serial")
public class ServicioDao extends GenericHome<Servicio>{
public ServicioDao(){}
@Override
protected Class<Servicio> getDomainClass() {
return Servicio.class;
}
}
public abstract class GenericHome<T> extends HibernateDaoSupport implements     Serializable{
protected Class<T> persistentClass = this.getDomainClass();
protected abstract Class<T> getDomainClass();
}
public class ServicioService {
private ServicioDao servicioDao;
public ServicioService(){}
public ServicioDao getServicioDao() {
return servicioDao;
}
@Autowired
public void setServicioDao(ServicioDao servicioDao) {
this.servicioDao = servicioDao;
}
}

共有2个答案

卢雅惠
2023-03-14

尝试为此更改bean定义:

<bean id="servicioDao" class="daos.ServicioDao" >
        <constructor-arg>
            <ref bean="persistence.sessionFactory" />
        </constructor-arg>
</bean>

这意味着您正在您的DAO类的构造函数中传递sessionFactory。

您还必须在“class”参数中写入完整传递。

<bean id="servicioDao" class="full.package.path.to.ServicioDao" >

接下来,在 DAO 类中编写如下内容:

@Repository
public class ServicioDao{
    private SessionFactory sessionFactory;

    public ServicioDao() {

    }

    /**
     * Constructor.
     *
     * @since 1.0
     */
    public ServicioDao(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    ...
    ...
 }

最后,在控制器中,可以使用DAO类,如下所示:

...
@Autowired
ServicioDao servicioDao;
...
servicioDao.getServicioDao();

请注意,您不需要创建新的服务服务();

对每个DAO类都这样做。

令狐嘉运
2023-03-14

我注意到,当我使用@Service和@Repository时,bean不是由xml创建的,所以当它给我错误“'setsionFactory'或'hibernateTemboard'是必需的”时,是因为道被创建但从未填充它的setsionFactory,所以要使用我的xml文件,我像普通bean一样创建了控制器

 类似资料:
  • 1. 前言 Hibernate 的核心价值观是:开发者们!做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一:会话工厂(SessionFactory)。 通过本节课,你将学习到: 会话工厂的设计要求; 会话工厂的核心功能。 2. 会话工厂的作用 原生 Jdbc 开发如同自己炒菜做饭,需经手买菜、洗菜、做菜……一系列过程。 基于 Hi

  • 我正在从事一个使用Hibernate4.1、Spring3.1和JPA2.0的项目,我想验证我从互联网上收集到的信息是否正确。 我正在尝试决定是使用JPA entityManager还是特定于hibernate的sessionFactory。 起初,我计划使用entityManager和完整的JPA规范,因此我的项目将与Hibernate脱钩,如果这种想法吸引了我,或者后来有什么东西说服了我,我可

  • GOF讨论了“工厂方法”模式的框架。框架需要对象,但对象的实现取决于应用程序,因此创建了创建对象的抽象方法。此外,由于需要返回类型,因此定义了所需对象的接口,它定义了对象所需的API。实际对象由子类创建(具体应用程序)。这是一种创造性的模式。 对于模板模式,唯一的变化是封装类不知道某些行为的实现,因此它将其抽象到方法中,使用它,但将实现留给子类。这是行为模式。 两者之间唯一的区别是 示例代码 现在

  • 我的Hibernate查询SessionFactory sessionFactory=new Configuration(). confiure(). buildSessionFactory(); sess=sessionFactory.openSession()有问题;我在每个函数中都调用它,我如何避免它只创建一次sessionFactory

  • 问题内容: 有谁知道如何获取由Spring Boot创建的Hibernate SessionFactory的句柄? 问题答案: 您可以使用以下方法完成此操作: 其中,entityManagerFactory是一个JPA 。

  • 我在我的程序中使用Hibernate注释,但它出错了。它没有返回我打开的会话工厂。我使用了netbean IDE,当我调试我的程序时,它想打开一个会话,下一步,它会转到,而不做任何其他事情。 这是我的文件夹。 在此输入图像描述 这是我的hibernate util 是我的类得到了会话工厂,但是得到了错误 然后在下一步之后也去上这门课 在此输入图像描述