2014-03-03 87 views
2

在我的應用程序中,當我需要在這些方法中訪問我的數據庫時,我一直將我的SessionFatory傳遞給我的方法參數。它使用實例在我的控制器:何時創建新的SessionFactory?

@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> 
+0

我沒有看到您創建新的'SessionFactory'對象。 –

+0

爲什麼你需要2個'SessionFactory'實例?請記住,'SessionFactory'實例是昂貴的資源。當你真的需要時,你應該只創建一個額外的對象,例如,當你想連接到單個應用程序中的多個數據庫時。 –

回答

0
的SessionFactory

Singleton。因此,您應該從ApplicationContext獲取它(即使用@Autowired註釋)。將它作爲參數傳遞只會使API複雜化。

+0

這個主題與'Singleton Pattern'沒什麼關係,主要關注主要問題。 – Antoniossss

+0

是的。你認爲可以傳遞一個Singleton作爲參數嗎? – Andres

+0

我認爲這是一個很好的話題。 OP是自動裝配它的,所以就這方面而言,自動裝配就很好。 – Antoniossss

0

我認爲您應該將SessionFactory的創建權保留到您正在使用的框架中,並將其作爲資源注入,就像您現在所做的那樣。除此之外你根本沒有在代碼中創建它。好的做法是爲每一塊數據操作創建單獨的會話,如果它不是由框架的c完成。會議應該是你的主要工作單位。

+0

所以如果我需要訪問另一個班級的數據庫,我只需要創建一個新的Session。那麼session.getCurrentSession()? – Jonathan

+0

當您調用getCurrentSession()方法時,您不會創建會話。 – Andres

+0

@Andres你是對的,但只是部分因爲它取決於實現(會話可以綁定到線程並被創建爲請求)以及它用於的上下文。 – Antoniossss

相關問題