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;
Session session=null;
try {
session=sessionFactory.getCurrentSession(); //获取session
session.beginTransaction();
Query query = session.createQuery(hql);
for (int i = 0; i < objects.length; i++) {
query.setParameter(i, objects[i]);
}
list = query.list();
session.getTransaction().commit();
logger.info("findByHql success!");
} catch (Exception e) {
e.printStackTrace();
logger.error("findByHql error");
}finally{
//session.close();
}
return list;
}
dao层:
public boolean save2(Addresses address) {
try {
this.save(address);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
------解决方案--------------------
呵呵 ,路过。
据我了解的,getCurrentSession是在开启事务后才能获取的。而openSession是可以随时开启。