Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 澄清Spring MVC ORM web app项目中的事件顺序_Java_Spring_Hibernate_Spring Mvc_Spring Orm - Fatal编程技术网

Java 澄清Spring MVC ORM web app项目中的事件顺序

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

我的教授给出了一个带有Hibernate的Spring MVC ORM项目示例,但我无法确定所涉及的事件顺序,特别是关于服务业务对象的使用。 这只是项目的一小部分,只是为了让我的想法更清楚

域:

@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;
    }
}