我们将继续有关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