何时创建一个新的SessionFactory?

时间:2014-03-03 19:17:34

标签: java spring hibernate

在我的应用程序中,当我需要在这些方法中访问我的数据库时,我一直在我的方法参数中传递SessionFatory。它在我的Controller中使用:

进行实例化
@Autowired
private SessionFactory sessionFactory;

当我需要访问我的数据库时,我使用这样的行:

sessionFactory.getCurrentSession().save() 
// or
List products = sessionFactory.getCurrentSession().createSQLQuery("SELECT * FROM PRODUCTS").list();

我应该创建新的sessionFactories来获取当前会话,还是应该将其作为参数传递?

编辑[为清晰起见而添加]:

来自HomeController.java:

@Controller 公共课HomeController {

@Autowired
private SessionFactory sessionFactory;
//Correlations Insert Handler
//DOCUMENT CREATE
@RequestMapping(value="/documents", method = RequestMethod.PUT)
public @ResponseBody String insertDocument(HttpServletRequest request, HttpServletResponse response){       

    DocumentControl documentControl = new DocumentControl();
    documentControl.insertDocument(request, response, sessionFactory);
    return "went through just find";

}
//DOCUMENT READ
@RequestMapping(value="/documents", method = RequestMethod.GET)
public @ResponseBody List<Documents> getAllDocuments(){
    //List documents = sessionFactory.getCurrentSession().createQuery("from Documents").list();         
    DocumentControl documentControl = new DocumentControl();
    List documents = documentControl.getAllDocuments(sessionFactory);
    return documents;
}

来自DocumentControl.java:

public class DocumentControl {

        private static Logger logger = Logger.getLogger(DocumentControl.class.getName());
        public DocumentControl(){};
        //CREATE
        public void insertDocument(HttpServletRequest request, HttpServletResponse response, SessionFactory sessionFactory){
    Documents document = new Documents(request)
        sessionFactory.getCurrentSession().save(document);  
        }           

        //READ
        public List<DocumentReturn> getAllDocuments(SessionFactory sessionFactory){
            List documents = sessionFactory.getCurrentSession().createQuery("from Documents").list();

            return documents;
        }



        private boolean ifProductExists (String productCode, SessionFactory sessionFactory) {
            boolean exists = false;

            List<Products> productList = sessionFactory.getCurrentSession().createCriteria(Products.class).add( Restrictions.eq("productCode", productCode)).list();

            if ( !productList.isEmpty()  && productList.size() > 0 ) {
                exists = true;
            }

            return exists;
        }

        private boolean ifStandardExists (String standardCode, SessionFactory sessionFactory) {
            boolean exists = false;

            List<Standards> standardList = sessionFactory.getCurrentSession().createCriteria(Standards.class).add( Restrictions.eq("standardCode", standardCode)).list();

            if ( !standardList.isEmpty()  && standardList.size() > 0 ) {
                exists = true;
            }

            return exists;
        }
    }

hibernate.cfg.xml中:

hibernate-configuration>
    <session-factory>
        <property name="hibernate.c3p0.acquire_increment">1</property>
        <property name="hibernate.c3p0.idle_test_period">100</property>
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.max_statements">10</property>
        <property name="hibernate.c3p0.min_size">10</property>
        <property name="hibernate.c3p0.timeout">100</property>      
        <mapping class="***.*****.********.model.Documents"/>
    </session-factory>
</hibernate-configuration>

持久性context.xml中:

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />     
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>             
                <prop key="hibernate.show_sql">true</prop>              
                <prop key=" hibernate.use_sql_comments">true</prop>     

            </props>
        </property>
    </bean>
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <

property name="sessionFactory" ref="sessionFactory" />
</bean>

2 个答案:

答案 0 :(得分:0)

SessionFactory是Singleton。因此,您应该从ApplicationContext获取它(即使用@Autowired注释)。将其作为参数传递只会使您的API复杂化。

答案 1 :(得分:0)

我认为您应该将SessionFactory的创建留给您正在使用的框架,并将其作为资源注入,就像您现在所做的那样。此外,您根本不在代码中创建它。好的做法是为每个数据操作块创建单独的会话,如果不是由框架ofc完成的话。会议应该是你的主要工作单元。