我們將繼續有關Spring 3 , Hibernate , JPA和JBoss 4.2.x – 4.3集成的教程 。
最后一步是創建一個Spring服務,以向最終用戶公開功能。 我們必須創建一個接口類和相關的實現類。 首先是接口類:
package com.mycomp.myproject.services;import com.mycomp.myproject.dto.EmployeeDTO;public interface ExampleService {public EmployeeDTO findEmployee(long employeeId);public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;public void deleteEmployee(long employeeId) throws Exception;}
如您所見,這是一個經典的Java接口類。 我們將在EmployeeDTO對象上實現創建,檢索,更新,刪除(CRUD)函數。
以下是指定接口的實現類。
package com.mycomp.myproject.services.impl;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.mycomp.myproject.dao.EmployeeDAO;
import com.mycomp.myproject.dto.EmployeeDTO;
import com.mycomp.myproject.services.ExampleService;@Service("exampleService")
public class ExampleServiceImpl implements ExampleService {@Autowiredprivate EmployeeDAO employeeDAO;@PostConstructpublic void init() throws Exception {}@PreDestroypublic void destroy() {}public EmployeeDTO findEmployee(long employeeId) {return employeeDAO.findById(employeeId);}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO == null) {employeeDTO = new EmployeeDTO(employeeId, name,surname, jobDescription);employeeDAO.persist(employeeDTO);}}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO != null) {employeeDTO.setEmployeeName(name);employeeDTO.setEmployeeSurname(surname);employeeDTO.setJob(jobDescription);}}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void deleteEmployee(long employeeId) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO != null)employeeDAO.remove(employeeDTO);}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = new EmployeeDTO(employeeId, name,surname, jobDescription);employeeDAO.merge(employeeDTO);}}
這里要注意的事情:
- 我們使用@Service (“ exampleService”)構造型注釋,以便聲明該類以名稱“ exampleService”表示Spring服務。 Spring容器將在啟動時實例化所有服務。
- 我們使用@Autowire批注將DAO類的實例注入“ exampleService”。 為了正確地實例化服務, Spring容器必須首先解析服務中所有可能的引用,因此實例化DAO類并將實例注入到“ exampleService”的適當字段–“ employeeDAO”字段。 如果您想知道,依賴項注入是根據類型(類)完成的,如果不滿足則是根據名稱完成的,這意味著如果我們定義了多個相同類型(類)的服務,則注入的服務將是名稱相同的服務作為指定字段。
- 我們使用Java批注@PostConstruct和@PreDestroy來聲明在初始化(完成所有依賴項注入)和服務的先前銷毀后Spring容器將調用的方法。
- 對于需要對數據庫執行更新操作的所有方法(INSERT,UPDATE,DELETE),我們使用@Transactional批注
- 我們不要在對數據庫執行檢索(FIND)操作的方法上使用@Transactional批注(包含延遲初始化的引用的對象除外-請參見下文),和/或不執行數據庫操作。 那是因為每次您調用一個注解為事務性的方法時, Spring容器都會涉及到調用JPA的實體管理器以及結果平臺的事務管理器,從而定義了將要應用的事務行為,特別是引入了明顯的性能損失。適用于低延遲/高吞吐量的應用程序。
- 對于對包含延遲初始化的引用的對象執行檢索(FIND)操作的方法,應使用@Transactional批注,指定“ NESTED ”傳播類型,以使Spring可以為整個方法調用保持Hibernate會話打開
- 事務處理行為僅應用于對服務的客戶端調用。 事務行為不適用于內部操作調用。 例如,如果客戶端調用未注釋為事務性的操作,而后者的實現將對同一服務的另一個操作的調用引入了注釋為事務性的調用,則對于合并的操作,將不會應用任何事務行為。
- 最終用戶應始終通過定義的界面訪問服務
那確實是一個很大的教程!
希望你喜歡它。
賈斯汀
翻譯自: https://www.javacodegeeks.com/2010/05/jboss-42x-spring-3-jpa-hibernate_21.html