日期:2014-05-18  浏览次数:20586 次

hibernate4+spring3 保存更新不了
hibernate4+spring3中调用了session.save();保存,但是没发sql语句,也没报错,我用的session=sessionFactory.getCurrentSession(); ,session生命期是交给spring管理的,所以我怀疑session一直没提交引起的,但是查询数据又都可以出来,后来我把session获取方式改成session=sessionFactory.openSession();并且手动session.close();这样就可以save成功并发sql了,但问题是用openSession的话,生命期就直接到session.close()结束了,纠结啊,我把我的配置贴出来一下,大家帮忙看下:
 <aop:aspectj-autoproxy expose-proxy="true" /> 

<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<!-- 事务的传播特性 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>
 <tx:method name="get*" read-only="true" propagation="REQUIRED"/>

      <tx:method name="find*" read-only="true" propagation="REQUIRED"/>

      <tx:method name="save*" propagation="REQUIRED"/>

      <tx:method name="update*" propagation="REQUIRED"/>

      <tx:method name="remove*" propagation="REQUIRED"/>

      <tx:method name="add*" propagation="REQUIRED"/>

<!--  hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到 -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>

<!-- 那些类那些方法使用事务 -->
<aop:config>
  <!-- 只对逻辑层实施事务 -->
<aop:pointcut id="allManagerMethod"
expression="execution(* com.dao.*.*(..))" />
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txadvice" />
</aop:config>


我的事务直接配置在dao层上!

public Serializable save(T t) throws HibernateException{
Session session=null;
Serializable id = null;
try {
session=sessionFactory.getCurrentSession();
session.beginTransaction();
id = session.save(t);
session.getTransaction().commit();
logger.info("save success!");

} catch (HibernateException e) {
e.printStackTrace();
logger.error("save fail!");
throw new HibernateException(e);
}finally{
//session.close(); //session不能直接关闭,否则生命期就断了
}
return id;
}

还有个问题:
配置事务后,查询时会出现一下错误:

org.hibernate.TransactionException: nested transactions not supported
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152)
at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1392)
at com.util.HibernateBaseDao.findByHql(HibernateBaseDao.java:312)
at com.dao.Impl.AddressDaoImpl.getAddressesByUid(AddressDaoImpl.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

这个好像是事务嵌套的错误,查询语句:
@SuppressWarnings("unchecked")
public List<T> findByHql(String hql,final Object...objects) throws Exception{
List<T> list=null;