通过getSessionFactory()保存对象.getCurrentSession()。save(item)

时间:2015-03-16 22:33:00

标签: 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);
    }

    @Transactional(readOnly = true)
    public List<Item> findAllItem(){
        return getSessionFactory().getCurrentSession().createQuery("from Item").list();
    }}

findAllItem()运行良好,而addItem()不适用。当我单击调用addItem()的按钮时,会抛出以下错误:

java.lang.ClassCastException:com.z.item.model.Item无法强制转换为java.util.Map javax.faces.el.E​​valuationException:java.lang.ClassCastException:com.z.item.model.Item无法强制转换为java.util.Map     at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98)     at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)     在javax.faces.component.UICommand.broadcast(UICommand.java:311) 。 。

但我没有指定任何地图,因为我使用了对象&#34; Item&#34;到处。传递给addItem()的Item对象也是正确的。为什么抛出这个异常?

以下是我配置它的方式:

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

3 个答案:

答案 0 :(得分:0)

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

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

@Transactional(readOnly=false)
public void addItem(Item item){
    getSessionFactory().getCurrentSession().save(item);
}

@Transactional(readOnly=true)
public List<Item> findAllItem(){
    return getSessionFactory().getCurrentSession().createQuery("from Item").list();
}

此外,您应该将地图更改为使用<class name="Item" table="item">而不是<class entity-name="com.z.item.model.Item" table="item">。此映射允许您以dom4j树的形式访问数据,或者作为属性名称/值对或java Maps的图形。仅指定没有任何关联类的XML映射。属性名称是纯逻辑构造,可以在HQL查询中引用。有关详细信息,请参阅here

  

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

答案 1 :(得分:0)

我不认为这是Hibernate引起的问题。单击按钮并在到达addItem()之前可能已经发生此问题。最有可能的是,它是数据映射问题(我假设您在单击按钮时首先将一些数据映射到Item)。在致电addItem()之前尝试打印项目,即使不调用addItem(),您也应该看到上述异常。

答案 2 :(得分:0)

实际上,我做了一些使这段代码正常工作的事情。

  1. 我已将我的dao方法更改为:

    @Transactional(唯读= FALSE) public void addItem(Item item){}

  2. 我在2.2中修改了pom.xml中的cglib版本。到2.1。

  3. 我已将配置更改为:

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