2011-07-18 71 views
1

我試圖谷歌的答案,但我仍然困惑他們的關係。 我推測Hibernate是一種DAO。 我在維基百科查了DAO, DAODAO和hibernate之間的關係

但是發現沒有什麼和hibernate有關。那麼,兩者之間的關係究竟是什麼?一些例子會很棒!

回答

10

不,休眠是一個Object-Relational-Mapper(也見Object-relational impedance mismatch)。

DAO是一個獨立於技術的設計模式。在Java平臺上的DAO通常使用一個(通常只有一個)的下列技術:JDBCHibernateJPAJDO

所以,你可以使用Hibernate不使用的DAO(雖然它很少是個好主意),你當然可以創建DAO不使用Hibernate。儘管如此,大約50%的Java DAO類是使用普通的Hibernate或JPA與Hibernate作爲JPA提供者創建的。

3

DAO通常描述您的應用程序和底層數據庫之間的接口。 您可以通過使用Hibernate是的Object-Relational-Mapper實現這個功能。

不要以爲我能更好地描述它 - 對不起。

0

數據訪問對象就是這樣的:訪問數據的對象。它通常是執行一些業務功能的應用程序的接口層。 DAO可能使用休眠與數據庫交談,從文件讀取,與遠程資源或其他任何事情交談。關鍵是應用程序的上層不知道或不需要關心。

Hibernate只是實現DAO的衆多方法之一。

public interface BusinessOperation { 
    public String bestVehicle(String show); 
} 

// Hibernate implementation of DAO 
public class HibernateBusinessOperation implements BusinessOperation { 
    @Override 
    public String bestVehicle(String show) { 
     String sql = "FROM show where show_name = :show"; 
     Query query = getSession().createQuery(sql); 
     query.setString("show", show); 
     Show queryResult = (Show) query.uniqueResult(); 
     if (queryResult == null) 
      throw new InvalidShowException(show); 
     return queryResult->getBestVehicle(); 
    } 
} 

// Test implementation of DAO 
public class TestBusinessOperation implements BusinessOperation { 
    @Override 
    public String bestVehicle(String show) { 
     if ("Knight Rider".equals(show)) { 
      return "KITT"; 
     } 
     if ("Airwolf".equals(show)) { 
      return "Airwolf"; 
     } 
     throw new InvalidShowException(show); 
    } 
}