2014-06-11 126 views
0

我正在使用Hibernate 4.3。我正在嘗試從HibernateUtil類中獲取SessionFactory對象。我想爲整個應用程序只獲得一個SessionFactory對象,即應用程序的單例對象。返回SessionFactory休眠4.3的Singleton對象

下面是我現在的代碼,我想讓它成爲Singleton類。

HibernateUtil.java

public class HibernateUtil { 

    private static SessionFactory sessionFactory; 
    private static StandardServiceRegistry serviceRegistry; 

    public static SessionFactory getSessionFactory() { 
     Configuration configuration = new Configuration(); 
     configuration.configure(); 
     serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
     sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
     return sessionFactory; 
    } 

} 

請建議或爲此提供的示例代碼。 謝謝。

+0

做的HibernateUtil一個Singleton類。 – shazin

回答

1

至於建議我所做的HibernateUtil.java類作爲辛格爾頓。 找到下面的代碼,並請建議/評論以確認代碼的正確性。

下面是更新後的代碼:

public class HibernateUtil { 

private static HibernateUtil instance = null; 

    private static SessionFactory sessionFactory; 
    private static StandardServiceRegistry serviceRegistry; 

    private HibernateUtil(){ 
     Configuration configuration = new Configuration(); 
     configuration.configure(); 
     serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
     sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
    } 

    public static HibernateUtil getInstance(){ 
     if(instance == null){ 
      instance = new HibernateUtil(); 
     } 
     return instance; 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

} 

請做修正,如果代碼是不正確的,並建議正確的方法。

+0

建議使用同步方法來獲取SessionFactory。此外,實例化類本身可能是多餘的,您必須在getSessionFactory之前調用getInstance()。 Antoniossss的答案最接近實現你想要的 – Jaden

1

只是申請單例模式

public class HibernateUtil { 

    private static StandardServiceRegistry serviceRegistry; 
    private volatile static SessionFactory INSTANCE = null; 

    public static SessionFactory getSessionFactory() { 
    if(INSTANCE==null){ 
     createSessionFactory(): 
    } 
    return sessionFactory; 
    } 

    private synchronized static void createSessionFactory() { 
    if(INSTANCE!=null){return;} 

    Configuration configuration = new Configuration(); 
    configuration.configure(); 

    serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
    INSTANCE = configuration.buildSessionFactory(serviceRegistry); 
    } 
} 
+0

與downvote建設性評論我看到:) – Antoniossss

+0

什麼是downvote爲?此外,第一**如果**沒有使用條件等號 – Jaden

+0

@Jaden感謝指出 - 校正比較運算符。我想知道爲什麼downvote以及;) – Antoniossss

1

而不是使HibernateUtil作爲singleton.Make SessionFactory作爲單例。

public class HibernateUtil { 

     private static SessionFactory sessionFactory; 

     static { 

      Configuration configuration = new Configuration(); 
      configuration.configure(); 
      StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
      sessionFactory=configuration.buildSessionFactory(serviceRegistry); 
     } 

     public static SessionFactory getSessionFactory() { 
      return sessionFactory; 
     } 
    } 

優點上述方法的如下

1.no同步碼(避免鎖定和解鎖爲每個方法調用) 2.no如果條件 3.sessionfactory是eagly實例化。(靜塊將在課堂生活時間內只能執行一次) 4.應用程序啓動本身,您可以在配置文件中找到錯誤。

請建議/評論在這個..

感謝