傳統上你會編寫接口來定義服務層和數據層之間的契約。然後您編寫實現,這些是您的DAO。
回到你的例子。假設機場和航空公司之間的關係是多對多的,並且包含airport_id和airline_id的表格,您可能會有一個界面;
public interface AirportDAO
{
public List<Airline> getAirlinesOperatingFrom(Set<Airport> airports);
}
..你可能會提供一個Hibernate的實現;
public class HibernateAirportDAO implements AirportDAO
{
public List<Airline> getAirlinesOperatingFrom(Set<Airport> airports)
{
//implementation here using EntityManager.
}
}
您還可以考慮在您的航空公司實體上使用List,並使用@ManyToMany JPA註釋定義關係。這將消除完全使用此特定DAO方法的必要性。
您可能還想了解用於編寫DAO工廠的抽象工廠模式。例如;
public abstract class DAOFactory
{
private static HibernateDAOFactory hdf = new HibernateDAOFactory();
public abstract AirportDAO getAirlineDAO();
public static DAOFactory getFactory()
{
//return a concrete implementation here, which implementation you
//return might depend on some application configuration settings.
}
}
public class HibernateDAOFactory extends DAOFactory
{
private static EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("myPersistenceUnit");
public static EntityManager getEM()
{
return emFactory.createEntityManager();
}
public AirportDAO getAirportDAO()
{
return new HibernateAirportDAO();
}
}
此模式允許您的HibernateDAOFactory保存單個EMF併爲EM提供單獨的DAO實例。如果你不想走低端路線,那麼Spring在處理DAO實例方面非常出色。
編輯:澄清了一些假設。
感謝您的詳細解答。我只是想知道:是否可以同時擁有DAO集合並在服務層中使用EntityManager? – 2010-10-07 14:02:31
我不認爲這有什麼問題,請記住Bohzo關於服務層是持久性不可知的說法。如果事情變得微不足道,我只需要一個使用實體管理器並處理所有實體的DAO。我從來沒有發現任何DAO特定於實體或表的常見模式的用法,我認爲DAO應該綁定到數據庫,如果該類變大,重構時顯然是多餘的 – walnutmon 2010-10-07 14:09:49
好。我主要看到DAO與單個實體/表格緊密結合,認爲解耦會違反良好實踐。所以Qwerky的答案getAirlinesOperatingFrom()方法是好的? – 2010-10-07 14:20:54