Session session = PeakSessionFactory.instance().getCurrentSession();
//tx= session.beginTransaction();
//session.merge(ad);
session.update(ad);
System.out.println("?????????????????????????");
//tx.commit();
System.out.println("????????????????????????!!!!!!!!!!?");
session.flush();
session.clear();
三种方法
1. 改update为merge也行。
2.加session.flush(); session.clear(); 也行
3.加事务处理貌似也行 但要many那边加
lazy="false"
但会报错事务没有启动的错误
找的文章:
Exception in thread "main" org.hibernate.HibernateException: *** is not valid without active transaction
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:338)
at $Proxy13.getListeners(Unknown Source)
at org.hibernate.search.backend.impl.EventSourceTransactionContext.getIndexWorkFlushEventListener(EventSourceTransactionContext.java:78)
at org.hibernate.search.backend.impl.EventSourceTransactionContext.<init>(EventSourceTransactionContext.java:41)
at org.hibernate.search.impl.FullTextSessionImpl.<init>(FullTextSessionImpl.java:75)
at org.hibernate.search.Search.getFullTextSession(Search.java:23)
at com.yin.hibernate.model.GuestBookTest.main(GuestBookTest.java:28)
在网上找的原因是:
如果使用hibernate的getCurrentSession()获得session对象,对查询语句也需要开启事务,不然就会抛出如上异常!
解决方法:
加上 Transaction tx = session.beginTransaction();
tx.commit();
注意:在 hibernate.cfg.xml
如果采用jdbc独立引用程序配置如下:
<property name=”hibernate.current_session_context_class”>thread</property>
如果采用了JTA事务配置如下
<property name=”hibernate.current_session_context_class”>jta</property>