How to get a factory session in my class using spring with hibernate

Here I am facing the problem that I have configured the hibernate sessionfactory in the application.xml file and after I can get the sessionFactory in my HibDao class (custom class) for user convenience like begin (), commit (), rollback ( ) with an extension of the HibernateDaoSupport ..

Here is my application-hibernate.xml file:

  <beans>   

<bean id="sessionFactory"       class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">     
    <property name="configLocation" value="/WEB-INF/hibernate.cfg.xml" />
</bean>



<!-- Transaction manager for a single Hibernate SessionFactory (alternative 
    to JTA) -->
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>


<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->

<!-- Data access object: Hibernate implementation. -->

<bean id="HibernateSpringDaoTarget" class="com.netprofit.dao.HibernateSpringDAOImpl">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>

<!-- - Transactional proxy for Application central data access object. 
    - - Defines specific transaction attributes with "readOnly" markers, - which 
    is an optimization that is particularly valuable with Hibernate - (to suppress 
    unnecessary flush attempts for read-only operations). - - Note that in a 
    real-life app with multiple transaction proxies, - you will probably want 
    to use parent and child bean definitions - as described in the manual, to 
    reduce duplication. -->

<bean id="SpringHibernateDao"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref local="transactionManager" />
    </property>
    <property name="target">
        <ref local="HibernateSpringDaoTarget" />
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="store*">PROPAGATION_REQUIRED</prop>
            <prop key="add*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

      

Here is the hibernate-cfg.xml file:

          <?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.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/netprofit</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">test</property>
    <property name="hibernate.connection.autocommit">false</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.jdbc.batch_size">50</property>


    <property name="hibernate.c3p0.max_size">1</property>
    <property name="hibernate.c3p0.min_size">0</property>
    <property name="hibernate.c3p0.timeout">5000</property>
    <property name="hibernate.c3p0.max_statements">1000</property>

    <property name="hibernate.c3p0.idle_test_period">300</property>
    <property name="hibernate.c3p0.acquire_increment">1</property>


    <mapping class="com.netprofit.dao.hibernate.HUserRegistrationPojo" />
</session-factory>

      

Here is the HibDao class (a custom class for simplicity):

  public class HibDao extends HibernateDaoSupport {
private static final ThreadLocal THREAD = new ThreadLocal();

protected HibDao() {
}

public static Session session() throws Exception {
    Session session = (Session) HibDao.THREAD.get();
    if (session == null) {            
        session = getSessionFactory().openSession();  **--->>>Here how can i open the Session**
        HibDao.THREAD.set(session);
        session().setFlushMode(FlushMode.COMMIT);
    }
    return session;
}

protected static void begin() throws Exception {
    session().beginTransaction();

}

protected static void commit() throws Exception {
    session().getTransaction().commit();
}

protected static void rollback() throws Exception {
    session().getTransaction().rollback();
    session().close();
    HibDao.THREAD.set(null);
}

protected static void flush() throws Exception {
    session().flush();
}

protected static void close() throws Exception {

    session().close();
    HibDao.THREAD.set(null);
}
 }

      

And after that I just extend the HibDao class and use the begin (), commit () and rollback () method to handle the hibernate transaction ... and also I'm not familiar with Spring ......

Thank....

+3


source to share


1 answer


No specific question asked (no comment line). I read the question like this: "I entered the SessionFactory bean XML file into the xml file. Now I want to remember it in a Java program."

Simple!

ApplicationContext context = new FileSystemXmlApplicationContext("c:/../application-hibernate.xml");
SessionFactory sessionFact = (SessionFactory) context.getBean("sessionFactory");

      



Now you can do:

Session session =  sessionFact.openSession();    

      

Note. I am extracting the bean by just parsing the xml file, but this is not a good practice. Ideally, you would retrieve the ApplicationContext object from the request object of the Servlet / Action class.

+2


source







All Articles