2015-06-30 3 views
1

Мои гибернации конфигурации:зимовать один сеанс активной транзакции

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
     <property  name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
    <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:XE</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> 
    <property name="hibernate.default_schema">gg</property> 
    <property name="hibernate.current_session_context_class">thread</property> 
<property name="show_sql">false</property> 
<property name="format_sql">true</property> 
<property name="use_sql_comments">true</property> 

    <mapping class="com.greengrass.house.Obj"></mapping> 
    <mapping class="com.greengrass.house.ObjxProp"></mapping> 
    <mapping class="com.greengrass.house.Property"></mapping> 
    <mapping class="com.greengrass.house.EvQue"></mapping> 
    <mapping class="com.greengrass.house.EvxObj"></mapping> 
</session-factory> 
</hibernate-configuration> 

Часть моей основной процедуры:

Session sess = HibernateUtil.getSessionFactory().openSession(); 
List<Obj> lobj = sess.createQuery(
    "from Obj").list(); 
sess.beginTransaction(); 
Obj o2=lobj.get(1); 
o2.crEvent("test", 3600, 1); //calling method 
sess.getTransaction().commit(); 

Один из способов моего объекта неизменного:

@Transient 
public void crEvent(String speech, int timeout, int maxCnt) { 
    Session s = HibernateUtil.getSessionFactory().getCurrentSession(); 
    if (!s.getTransaction().isActive()) { 
     System.out.println("No transaction!!!"); 
    } else { 
     System.out.println("Exist transaction!!!"); 
    } 
    Query query = s.createSQLQuery(
      "CALL p_event.cr_event(:p_speech, :p_tm, :p_max_cnt)") 
      .setParameter("p_speech", speech) 
      .setParameter("p_tm", timeout) 
      .setParameter("p_max_cnt", maxCnt); 
    int exRows = query.executeUpdate();  
} 

Так я получаю это результат:

No transaction!!! <--Message from the my method 

Exception in thread "main" org.hibernate.HibernateException: createSQLQuery is not valid without active transaction 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:348) 
    at com.sun.proxy.$Proxy16.createSQLQuery(Unknown Source) 
    at com.greengrass.house.Obj.crEvent(Obj.java:273) 
    at com.greengrass.evhandler.GreenEvHandler.main(GreenEvHandler.java:36) 

Так что я не понимаю, почему HibernateUtil.getSessionFactory(). GetCurrentSession(); в методе crEvent, не может продолжить активную транзакцию из основной процедуры?

ответ

1

Всякий раз, когда вы хотите иметь дело с контекстной сессией в Hibernate (3.0.1+), вы должны использовать getCurrentSession(). Вам не нужно (и вы не должны) сначала позвонить openSession(). Из manual (v4.3, §3.9.3):

Использование «JTA,» контекст сеанса, если нет Hibernate Session, связанный с текущей транзакции JTA, один будет запущен и связанный с этим JTA транзакции в первый раз вы называете sessionFactory.getCurrentSession().

В отличие openSession всегда открывает новую сессию, которую вы должны затем закрыть (например, с try-with-resources), прежде чем она выходит из области видимости. Сессия, открытая openSession, не является контекстным сеансом спящего режима.

Вы можете (как правило) увидеть, если два сеанса экземпляра одинаковы, сравнивая hashCodes:

Session s1 = HibernateUtil.getSessionFactory().getCurrentSession(); 
Session s2 = HibernateUtil.getSessionFactory().openSession(); 
Session s3 = HibernateUtil.getSessionFactory().getCurrentSession(); 
System.out.println("getCurrent is " + s1.hashCode()); 
System.out.println("openSession is " + s2.hashCode()); 
System.out.println("getCurrent is " + s3.hashCode()); 
s2.close(); 

выходы:

getCurrent is 392918519 
openSession is 1499840045 
getCurrent is 392918519 
+0

Спасибо большое, так что мне нужно перечитать документацию, спасибо в совете! – Lev

Смежные вопросы