Java 澄清Spring MVC ORM web app项目中的事件顺序
我的教授给出了一个带有Hibernate的Spring MVC ORM项目示例,但我无法确定所涉及的事件顺序,特别是关于服务业务对象的使用。 这只是项目的一小部分,只是为了让我的想法更清楚 域:Java 澄清Spring MVC ORM web app项目中的事件顺序,java,spring,hibernate,spring-mvc,spring-orm,Java,Spring,Hibernate,Spring Mvc,Spring Orm,我的教授给出了一个带有Hibernate的Spring MVC ORM项目示例,但我无法确定所涉及的事件顺序,特别是关于服务业务对象的使用。 这只是项目的一小部分,只是为了让我的想法更清楚 域: @Entity @Table(name = "department") public class Department implements Serializable { private static final long serialVersionUID = 1L; @Id
@Entity
@Table(name = "department")
public class Department implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long uid;
private String name;
@OneToMany(mappedBy="department",cascade=CascadeType.PERSIST)
private List<Employee> employees = new ArrayList<Employee>();
public Department() {
}
public Department(String name) {
this.name = name;
}
// getters, setters, hashcode() and equals(), toString()...
@实体
@表(name=“department”)
公共类部门实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@生成值
私人长uid;
私有字符串名称;
@OneToMany(mappedBy=“department”,cascade=CascadeType.PERSIST)
private List employees=new ArrayList();
公共部门(){
}
公共部门(字符串名称){
this.name=名称;
}
//getter、setter、hashcode()和equals()、toString()。。。
控制器:
@Controller
@RequestMapping("/department")
public class DepartmentController {
@Autowired
@Qualifier("departmentBO")
private DepartmentBO departmentBO;
static final Logger logger = Logger.getLogger(DepartmentController.class);
@RequestMapping(value = "/home", method = RequestMethod.GET)
public String departmentHome(Model model) {
logger.debug("department home() invoked");
List<Department> list = departmentBO.findAllDepartments();
model.addAttribute("list", list);
return "departments";
}
// i'll paste just the first controller ;)
@控制器
@请求映射(“/部门”)
公共课系主任{
@自动连线
@限定词(“departmentBO”)
私人部门;
静态最终记录器=Logger.getLogger(DepartmentController.class);
@RequestMapping(value=“/home”,method=RequestMethod.GET)
公共字符串部门主页(模型){
debug(“调用了department home());
List List=departmentBO.findAllDepartments();
model.addAttribute(“列表”,列表);
返回“部门”;
}
//我只粘贴第一个控制器;)
业务:
public interface DepartmentBO {
public void delete(long uid);
public List<Department> findAllDepartments();
public Department findByUid(Long uid);
public void save(Department department);
public void update(Department department);
}
公共接口部门{
公共无效删除(长uid);
公共列表findAllDepartments();
公共部门findByUid(长uid);
公共作废保存(部门);
公共空间更新(部门);
}
业务/执行:
@Service
@Transactional
public class DepartmentBoImpl implements DepartmentBO {
@Autowired
private DepartmentDAO departmentDao;
static final Logger logger = Logger.getLogger(DepartmentBoImpl.class);
@Override
public void save(Department department) {
departmentDao.save(department);
}
@Override
public void update(Department department) {
departmentDao.update(department);
}
@Override
public void delete(long uid) {
departmentDao.delete(uid);
}
@Override
public List<Department> findAllDepartments() {
return departmentDao.findAllDepartments();
}
@Override
public Department findByUid(Long uid) throws DataAccessException {
return departmentDao.findByUid(uid);
}
}
@服务
@交易的
公共类DepartmentBoImpl实现DepartmentBO{
@自动连线
私人部门;
静态最终记录器=Logger.getLogger(DepartmentBoImpl.class);
@凌驾
公共作废保存(部门){
部门DAO.save(部门);
}
@凌驾
公共作废更新(部门){
部门更新(部门);
}
@凌驾
公共无效删除(长uid){
departmentDao.delete(uid);
}
@凌驾
公共列表findAllDepartments(){
return departmentDao.findAllDepartments();
}
@凌驾
公共部门findByUid(长uid)引发DataAccessException{
返回部门dao.findByUid(uid);
}
}
道:
公共接口部门dao{
公共无效删除(长uid);
公共列表findAllDepartments();
公共部门findByUid(长uid);
公共作废保存(部门用户);
公共作废更新(部门用户);
}
dao/impl:
@Repository
public class DepartmentDAOImplSf implements DepartmentDAO {
@Autowired
private SessionFactory sessionFactory;
@Override
public void delete(long uid) {
Department department = (Department) sessionFactory.getCurrentSession()
.get(Department.class, uid);
sessionFactory.getCurrentSession().delete(department);
}
@Override
public void save(Department department) {
sessionFactory.getCurrentSession().save(department);
}
@Override
public void update(Department department) {
sessionFactory.getCurrentSession().saveOrUpdate(department);
}
@Override
public List<Department> findAllDepartments() {
List<Department> list = (List<Department>) sessionFactory
.getCurrentSession()
.createQuery("FROM Department").list();
return list;
}
@Override
public Department findByUid(Long uid) {
Department department = (Department) sessionFactory
.getCurrentSession().get(Department.class, uid);
return department;
}
}
@存储库
公共类DepartmentDAOImplSf实现DepartmentDAO{
@自动连线
私人会话工厂会话工厂;
@凌驾
公共无效删除(长uid){
Department Department=(Department)sessionFactory.getCurrentSession()
.get(Department.class,uid);
sessionFactory.getCurrentSession().delete(部门);
}
@凌驾
公共作废保存(部门){
sessionFactory.getCurrentSession().save(部门);
}
@凌驾
公共作废更新(部门){
sessionFactory.getCurrentSession().saveOrUpdate(部门);
}
@凌驾
公共列表findAllDepartments(){
列表=(列表)会话工厂
.getCurrentSession()
.createQuery(“来自部门”).list();
退货清单;
}
@凌驾
公共部门findByUid(长uid){
部门=(部门)会话工厂
.getCurrentSession().get(Department.class,uid);
退货部;
}
}
我知道顺序是:域模型->控制器->服务->dao->数据库,但为什么要使用DepartmentBO?为什么DepartmentBoImpl自动连线DepartmentDao?他们中谁先采取行动?我不明白的是,我对它的工作原理和过程顺序的概念混乱了。。
谢谢你的帮助;)
编辑:“
简单地说,我的问题是,这段代码的顺序是什么?用户进入/home页面,在“departments”页面上重定向。但是在此之前会发生什么-->“List List=departmentBO.findAllDepartments();”?;)当departmentBO.findAllDepartments()如果查看调用sessionFactory的代码,就会调用该方法。这是Hibernate中的一个内部工厂类,它基本上构建到DB的事务性连接以运行查询。您在createQuery方法中定义查询,然后最终使用list()执行查询这两个方法是Hibernate实例化的数据库会话的一部分 部门页面->部门bo.findAllDepartments()->sessionFactory->createQuery->list() 或者使用伪代码
部门页面->执行findAllDepartments方法->获取/建立数据库连接->定义查询->执行查询->返回列表!这些页面背后有很多设计和架构。依赖注入、通过接口编程、数据访问模式等等。下面是几篇在线文章。我知道会发生这样的事情,但我的问题是,这段代码的顺序是什么?用户在indexpage上重定向到“departments”。但是当departmentBO.findAllDepartments()时,在-->“List List List=departmentBO.findAllDepartments();”?;)后面会发生什么方法被调用,它将委托给Hibernate的sessionFactory,获取会话并创建一个查询,并以部门列表的形式返回结果集。它基本上是使用给定的查询语句查询数据库。要了解更多信息,您必须查看Hibernate框架文档。我感谢您的解释,但我认为我的问题更简单,为什么要离开
@Repository
public class DepartmentDAOImplSf implements DepartmentDAO {
@Autowired
private SessionFactory sessionFactory;
@Override
public void delete(long uid) {
Department department = (Department) sessionFactory.getCurrentSession()
.get(Department.class, uid);
sessionFactory.getCurrentSession().delete(department);
}
@Override
public void save(Department department) {
sessionFactory.getCurrentSession().save(department);
}
@Override
public void update(Department department) {
sessionFactory.getCurrentSession().saveOrUpdate(department);
}
@Override
public List<Department> findAllDepartments() {
List<Department> list = (List<Department>) sessionFactory
.getCurrentSession()
.createQuery("FROM Department").list();
return list;
}
@Override
public Department findByUid(Long uid) {
Department department = (Department) sessionFactory
.getCurrentSession().get(Department.class, uid);
return department;
}
}