2013-01-02 91 views
1

對於通常使用Hibernate的正確方式,有許多不同的示例,教程和評論。所以我希望你看看我的代碼,並確認我正確使用它,或者我錯誤地使用它。
編輯 我單獨使用Hibernate。 Hibernate的4:)使用Hibernate的「正確方法」

public class HibernateUtil { 

private static SessionFactory sessionFactory = buildSessionFactory(); 


private static SessionFactory buildSessionFactory() { 
try { 
    // Create the SessionFactory from hibernate.cfg.xml 
    System.out.println("Building new SessionFactory !!"); 
    Configuration configuration = null; 
    ServiceRegistry serviceRegistry = null; 
    try{ 

     configuration = new Configuration(); 

      configuration.configure(); 
     serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

    return new Configuration().configure().buildSessionFactory(serviceRegistry); 

} 
catch (Throwable ex) { 
    // Make sure you log the exception, as it might be swallowed 
    System.err.println("Initial SessionFactory creation failed." + ex); 
    throw new ExceptionInInitializerError(ex); 
} 
} 


//Since thread unsafe 
/** 
* thread safe or unsafe ? 
* assuming thread safe 
* @return 
*/ 
public static SessionFactory getSessionFactory() { 

    return sessionFactory; 

} 

public static void tryCloseAll(Session s, Transaction t){ 

    try{ 

     if(t!=null){ 
      if(t.isActive()){ 
       //? 
       try{ 
        t.commit(); 
        System.out.println("HibernateUtil.tryCloseAll():: Transaction successfully committed."); 
       }catch(Exception e){ 
        System.out.println("HibernateUtil.tryCloseAll():: Exception thrown while trying to commit a transaction."); 
       }finally{ 
        t = null; 
        System.out.println("HibernateUtil.tryCloseAll():: Transaction successfully nullified."); 
       } 
      } 

     }else{ 
      System.out.println("HibernateUtil.tryCloseAll():: The method has received a null transaction"); 
     } 

     if(s!=null){ 
      if(s.isOpen()){ 
       try{ 
        s.close(); 
        System.out.println("HibernateUtil.tryCloseAll():: Session successfully closed."); 
       }catch(Exception e){ 
        System.out.println("HibernateUtil.tryCloseAll():: Tried to close session and failed"); 
       }finally{ 
        s = null; 
        System.out.println("HibernateUtil.tryCloseAll():: Session successfully nullified."); 
       } 
      } 
     }else{ 
      System.out.println("HibernateUtil.tryCloseAll():: The method has received a null session"); 
     } 


    }catch(Exception e){ 

    } 
} 

和我的DAO類

public class SuperItemDAO extends MSSQLDAO implements InterfaceSuperItemDAO{ 
private SessionFactory sessionFactory = null; 

public static SuperItemDAO getInstance(){ 

    if(INSTANCE == null){ 
     INSTANCE = new SuperItemDAO(); 
    } 

    return INSTANCE; 
} 

SuperItemDAO(){ 

    if(sessionFactory == null){ 
     sessionFactory = HibernateUtil.getSessionFactory(); 
    } 
} 
public SuperItemVO get(int id){ 
     SuperItemVO sivo = null; 
     Session session = null; 
     Transaction transaction = null; 
     try{ 
     session = sessionFactory.getCurrentSession(); 
     transaction = session.getTransaction(); 
     transaction.begin(); 

     Criteria criteria = session.createCriteria(SuperItemVO.class); 
     criteria.add(Restrictions.eq("id", id)); 
     sivo = (SuperItemVO)criteria.uniqueResult(); 

     transaction.commit(); 
    }catch(Exception e){e.printStackTrace();}finally{HibernateUtil.tryCloseAll(session, transaction);} 

    return sivo; 

} 
+0

你是單獨使用hibernate還是使用spring? – Sikorski

+0

@Sikorski,看看我的編輯。 – Ascendant

+3

'正確的方法'是不要使用休眠:) – jackalope

回答

2

我會建議你使用彈簧交易與Hibernate爲您的交易管理一起。否則,它是一個夜間管理交易。

另外,使用Hibernate的另一種正確方法是使用註釋來代替xml文件,這使得代碼非常直觀且易於管理。

此外,您可能會考慮將JPA與hibernate一起使用,因爲這是Java層的標準。

+0

嗯,我只是儘管我會先習慣Hibernate,然後春天,JPA等,因爲一次學習他們所有人不必要的困難。感謝您的意見。我會考慮你的建議。 – Ascendant

+0

@PerfectGundam我明白你來自哪裏。我經歷了同樣的循環。相信我使用註釋會使您的學習曲線變得更加陡峭。後來它的發展也會更快。而且你已經在研究最新的技術。 – Deepak

+0

@Deepak僅供參考:「陡峭的學習曲線」=「讓學習更難」。 –

0

FYI:此部分:

Criteria criteria = session.createCriteria(SuperItemVO.class); 
    criteria.add(Restrictions.eq("id", id)); 
    sivo = (SuperItemVO)criteria.uniqueResult(); 

更好用,可以充分利用緩存,更好地代表你從可讀性的角度做一個呼叫表示。

SuperItemVO sivo = session.get(SuperItemVO.class, id); 
+0

如果我理解你的觀點正確,底部的方法被緩存並且更具可讀性。 – Ascendant

+0

是的,差不多。最底層的甚至可能甚至不需要去數據庫。最上面的一個可以利用一些緩存,但只能在SuperItemVO(如果有的話)和SuperItemVO對象本身的關係中使用。 – Matt

+0

謝謝指出:) – Ascendant