繼我上一個問題DAO and Service layers (JPA/Hibernate + Spring)之後,我決定在使用JPA/Hibernate的應用程序中爲我的數據層使用一個DAO(至少在開始時)春天和Wicket。提出了使用通用CRUD方法,但我不太確定如何使用JPA來實現此方法。您能否給我舉個例子或者分享一個關於這個的鏈接?單個DAO和通用的CRUD方法(JPA/Hibernate + Spring)
回答
下面是一個例子接口:
public interface GenericDao<T, PK extends Serializable> {
T create(T t);
T read(PK id);
T update(T t);
void delete(T t);
}
和實施:
public class GenericDaoJpaImpl<T, PK extends Serializable>
implements GenericDao<T, PK> {
protected Class<T> entityClass;
@PersistenceContext
protected EntityManager entityManager;
public GenericDaoJpaImpl() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperclass
.getActualTypeArguments()[0];
}
@Override
public T create(T t) {
this.entityManager.persist(t);
return t;
}
@Override
public T read(PK id) {
return this.entityManager.find(entityClass, id);
}
@Override
public T update(T t) {
return this.entityManager.merge(t);
}
@Override
public void delete(T t) {
t = this.entityManager.merge(t);
this.entityManager.remove(t);
}
}
,如果你正在尋找一個第三方的實現,你可以檢查 http://www.altuure.com/projects/yagdao/。它是一個基於nnotation的通用DAO框架,支持JPA和休眠
我一直在尋找同樣的東西。我發現了SpringSource提供的JPA項目。這是一個代碼端口,從Hades開始,現在已經(2011年初)被Spring吞併並更好地整合。 它允許您使用靜態創建的單個dao(SimpleJpaRepository),或者擴展基礎JpaRepository類,以使用現成的CRUD +方法創建任何對象特定的dao。在接口中也允許使用參數名稱作爲方法名稱的grails(無需實現),例如 看起來非常有前途 - 作爲Spring項目的一部分,它肯定會爲它確保一些未來。 我現在已經開始在即將開展的項目中實現這個功能。
根據文章Don't repeat the DAO我們使用這種技術多年。在意識到我們犯了一個大錯誤之後,我們一直在努力解決模式方面的問題。
通過使用ORM工具(如Hibernate或JPA),您不必分別考慮DAO和服務層。您可以在您的服務類中使用EntityManager,因爲您知道事務的生命週期以及您的實體類的邏輯。
如果您撥打myDao.saveEntity
而不是簡單地撥打entityManager.saveEntity
,您是否可以省時?不會。您將有一個不必要的dao類,它不會執行任何其他操作,但會成爲EntityManager的包裝。不要害怕在EntityManager(或休眠中的會話)的幫助下在你的服務類中寫入選擇。
還有一點需要注意:您應該定義服務層的邊界,並且不要讓程序員返回或等待實體類。 UI或WS層程序員根本不應該知道實體類只關於DTO-s。實體對象具有大多數程序員不知道的生命週期。如果將實體對象存儲在會話數據中並嘗試在數秒或數小時後將其更新回數據庫,則會遇到非常嚴重的問題。那麼你可能不會這樣做,但知道服務層的參數類型和返回類型的UI程序員只會保存一些代碼行。
EJB中的註釋事務管理?雖然你可能需要更復雜的DAO,它不再是通用的,但無論如何。我仍然發現這種方法在特定情況下可能有用。 – 2015-02-05 07:34:25
您也可以看看http://codeblock.engio.net/data-persistence-and-the-dao-pattern/
相關的代碼可以在GitHub上找到https://github.com/bennidi/daoism
它與Spring和Hibernate的配置實例和的EclipseLink
- 1. Spring通用Hibernate DAO
- 2. Spring MVC:通用DAO和服務類
- 3. Spring EhCache抽象通用DAO
- 4. Hibernate和Spring DAO
- 5. DAO方法檢索單個條目
- 6. Spring DAO的用例
- 7. DAO只負責CRUD操作?
- 8. 通用DAO模式Spring JDBC模板
- 9. Spring DAO文件,rowmapper不通用
- 10. PHPUnit和測試CRUD方法
- 11. Spring Cache抽象和JDBC DAO
- 12. Spring 3和Hibernate 4 Dao
- 13. MVC中的單個DAO或多個DAO?
- 14. 爲什麼使用Spring DAO類而不是普通方法進行接口?
- 15. ADO.NET CRUD方法
- 16. 使用Hibernate和Repository模式的多個類似的CRUD方法?
- 17. DAO,Spring,Hibernate,Jboss
- 18. DAO,Spring and Hibernate
- 19. Spring DAO性能
- 20. Spring JDBCTemplate:可以在RowMapper中調用DAO方法嗎?
- 21. 帶有Spring JDBC模板的DAO:單元測試的最佳方法
- 22. AppFuse通用/通用DAO和管理器用法
- 23. MVC ASP.NET和EF中的CRUD交叉表的簡單方法?
- 24. 分離GUI和DAO通過REST Web服務和Spring
- 25. 如何使用LINQ to SQL創建通用數據訪問對象(DAO)CRUD方法
- 26. 最簡單的方法,使java crud應用程序
- 27. Basic CRUD UI Spring
- 28. 通用方法和這個
- 29. Dao方法,操作單個/多個對象並關閉資源
- 30. 使用Spring實現DAO
整合如何將這項契合與slsb和pojo實體(代表db表)? – NimChimpsky 2010-10-08 11:20:28
很棒的回答。只有幾點意見:我寧願將Class作爲參數傳遞給構造方法(而不是未經檢查的轉換);刪除方法中的參數t不應該重新分配,並且類最好是抽象的。 – megathor 2014-07-16 01:58:48
謝謝!!!!!!!!很多! – verystrongjoe 2015-08-28 06:12:46