hibernate4+spring3 保存更新不了

夜之子 2013-05-12 09:03:10
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;
}
...全文
152 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nb1900 2014-11-25
  • 打赏
  • 举报
回复
楼主怎么解决的????
chenglei20008 2014-08-20
  • 打赏
  • 举报
回复
怎么解决的的,求解求解
hua3392 2014-03-13
  • 打赏
  • 举报
回复
楼主,后面怎么解决的
leeking888 2013-06-18
  • 打赏
  • 举报
回复
呵呵 ,路过。 据我了解的,getCurrentSession是在开启事务后才能获取的。而openSession是可以随时开启。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧