Spring 通过getSessionFactory()保存对象。getCurrentSession()保存(项)

Spring 通过getSessionFactory()保存对象。getCurrentSession()保存(项),spring,hibernate,hibernate-mapping,hsqldb,spring-transactions,Spring,Hibernate,Hibernate Mapping,Hsqldb,Spring Transactions,即使这个操作似乎被非常频繁地使用,我也没有发现代码中的问题在哪里。 在DAO类中,我有: public class ItemDaoImpl extends HibernateDaoSupport implements ItemDao { @Transactional public void addItem(Item item){ getSessionFactory().getCurrentSession().save(item); } @

即使这个操作似乎被非常频繁地使用,我也没有发现代码中的问题在哪里。 在DAO类中,我有:

    public class ItemDaoImpl extends HibernateDaoSupport implements ItemDao {
    @Transactional
    public void addItem(Item item){
        getSessionFactory().getCurrentSession().save(item);
    }

    @Transactional(readOnly = true)
    public List<Item> findAllItem(){
        return getSessionFactory().getCurrentSession().createQuery("from Item").list();
    }}
public类ItemDaoImpl扩展了HibernateDaoSupport实现了ItemDao{
@交易的
公共无效附加项(项目){
getSessionFactory().getCurrentSession().save(项);
}
@事务(只读=真)
公共列表findAllItem(){
返回getSessionFactory().getCurrentSession().createQuery(“从项”).list();
}}
findAllItem()工作正常,而addItem()工作不正常。当我单击调用addItem()的按钮时,会引发以下错误:

java.lang.ClassCastException:com.z.item.model.item无法转换为java.util.Map javax.faces.el.EvaluationException:java.lang.ClassCastException:com.z.item.model.item不能强制转换为java.util.Map 位于javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98) 位于com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98) 位于javax.faces.component.UICommand.broadcast(UICommand.java:311) . .

但是我没有指定任何贴图,因为我在任何地方都使用对象“Item”。传递给addItem()的项对象也是正确的。为什么会抛出此异常

以下是我如何配置它:

<hibernate-mapping>
    <class entity-name="com.z.item.model.Item"
        table="item">

        <id name="id" type="long">
            <column name="ID" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="ITEMNAME" length="45" not-null="true" />
        </property>
        <property name="amount" type="int">
            <column name="AMOUNT" not-null="true" />
        </property>
        <property name="price" type="java.math.BigDecimal">
            <column name="PRICE" length="10" not-null="true" />
        </property>
    </class>
</hibernate-mapping>


    <tx:annotation-driven  transaction-manager="transactionManager"/>
    <bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <bean id="itemDao"
         class="com.z.item.dao.impl.ItemDaoImpl" >
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>



   <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
      <ref bean="dataSource"/>
    </property>


    <property name="hibernateProperties">
       <props>
         <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
         <prop key="hibernate.show_sql">true</prop>
       </props>
    </property>
    <property name="mappingResources">
    <list>
          <value>com/z/item/hibernate/Item.hbm.xml</value>
    </list>
    </property>
   </bean>

org.hibernate.dialogue.hsql方言
符合事实的
com/z/item/hibernate/item.hbm.xml

对于
@Transactional
注释,您需要使用
false
指定写入(保存和删除)DAO方法,使用
true
指定读取(获取和加载)方法

@Transactional
只是为方法或类添加某些元数据,关于事务是只读的还是写的,或者它是否需要新事务等。。有关@Transactional注释的更多信息,请阅读

@Transactional(readOnly=false)
公共无效附加项(项目){
getSessionFactory().getCurrentSession().save(项);
}
@事务(只读=真)
公共列表findAllItem(){
返回getSessionFactory().getCurrentSession().createQuery(“从项”).list();
}
此外,您应该将映射更改为使用
而不是
。此映射允许您以dom4j树、属性名称/值对图或java映射的形式访问数据。仅指定没有任何关联类的XML映射。属性名是纯逻辑结构,可以在HQL查询中引用。有关更多信息,请参阅

实体名称(可选-默认为类名):Hibernate3允许 要多次映射的类,可能映射到不同的表。 它还允许以映射或XML表示的实体映射 Java级别。在这些情况下,您应该提供一个明确的 实体的任意名称。见第4.4节“动态模型”和 第18章,XML映射以获取更多信息


我不认为这是由Hibernate引起的问题。当您单击按钮时,在到达
addItem()
之前,该问题可能已经发生。最有可能的是数据映射问题(我假设您在单击按钮时首先将一些数据映射到项)。在调用
addItem()
之前,尝试打印项目,即使不调用
addItem()
,实际上,我做了几件事来让代码正常工作

  • 我已将dao方法更改为:

    @事务(只读=假) 公共无效附加项(项目){}

  • 我已经从2.2版修改了pom.xml中的cglib版本。至2.1

  • 我已将配置更改为:

    <class name="pl.outbox.item.model.Item" table="item">
    <id name="id" type="int">
        <column name="ID" />
        <generator class="increment"/>
    </id>
    
    
    

  • 这里有问题吗?或者我应该修复上面显示的所有问题..我遵循了您的想法:首先,我为addItem()添加了@Transactional(readOnly=false)。但是ClassCastException仍然被抛出。然后我尝试了你的另一个想法,并删除了addItem()上的注释,但是我又遇到了另一个错误,这次是:org.hibernate.hibernateeexception:没有绑定到线程的hibernate会话,并且配置不允许创建非事务性会话。我已经编辑了我的答案,以反映映射中的更改,您应该尝试。这应该解决案件问题。对不起,我错过了。我还假设这是一个简单的对象关系?你不想要任何特殊的映射吗?对于“绑定到线程”问题。这是独立的,与如何创建hibernate会话有关。看:我认为我们正朝着正确的方向前进。在我看的教程中,它是名称,但我将其更改为实体名称。我更改了它,因为它正在修复另一个错误:严重:上下文初始化失败org.springframework.beans.factory.BeanCreationException:创建名为“sessionFactory”的bean时出错,该名称在ServletContext资源[/WEB-INF/classes/config/spring/beans/HibernateSessionFactory.xml]:调用init方法失败;嵌套异常为org.hibernate.HibernateException:无法实例化默认的tuplizer[org.hibernate.tuple.entity.PojoEntityTuplizer]…完美。现在,您只需要解决这些其他问题,并查看会话事务管理。对于上述异常,请查看您是如何注入会话的,以及如何定义会话的。您遇到的是一系列错误或不同的问题。也许可以尝试将一个问题或相关问题保留在一个线程中。如果有必要的话,再问一个问题。没错,我不确定这是否是一个休眠问题。但是如果映射错误,那么我的findAllItem()就不应该工作
    <class name="pl.outbox.item.model.Item" table="item">
    <id name="id" type="int">
        <column name="ID" />
        <generator class="increment"/>
    </id>