Spring 通过getSessionFactory()保存对象。getCurrentSession()保存(项)
即使这个操作似乎被非常频繁地使用,我也没有发现代码中的问题在哪里。 在DAO类中,我有: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); } @
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()
,实际上,我做了几件事来让代码正常工作
<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>