Hibernate jackson何时进行序列化

时间:2017-05-22 08:43:12

标签: spring hibernate jackson

我正在学习Spring,Hibernate,Jackson& AngularJS。

我正在尝试了解使用Spring,Hibernate,Jackson& S时应用程序和数据库之间的生命周期。 AngularJS。因为我觉得我在杰克逊和杰克逊之间感到困惑Java序列化/反序列化....他们做同样的事情吗?他们在不同的时间做不同的事情。

以下是Hiberante ORM架构的简单图表,我在阅读文档时如何理解它。 Hibernate使用applicationContext或config.xml中的配置创建单个SessionFactory并在整个应用程序中共享它。 SessionFactory创建会话,其中包含save(),saveOrUpdate(),delete()......等方法。

enter image description here

Hibernate有3种操作状态。

  • 瞬态:与数据库无关的对象。
  • 持久状态:对象与数据库标识映射。
  • 分离状态:当会话关闭时持久状态完成时,对象变为分离....

enter image description here

所以如果我有一个将书籍插入数据库的控制器

// create book entry
@RequestMapping(path="/booklist", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Book> newBook(@RequestBody @Valid Book book, BindingResult result){

    if(result.hasErrors()){

        //------
        //  Some error code handling
        //------

        book.setErrorObjBuilder(errorObjBuilder);

        return new ResponseEntity<Book>( book, HttpStatus.NOT_ACCEPTABLE);

    }else{
        bookDao.saveOrUpdate(book);


        return new ResponseEntity<Book>(book, HttpStatus.ACCEPTED);
    }
};
  1. 书籍对象传入newBook(@RequestBody @Valid Book book)它是否已经序列化(java.io.Serializable)?或序列化发生在bookDao.saveOrUpdate(book)

  2. 序列化是否在本书是持久对象之前发生?

  3. 在上面的示例中,杰克逊序列化或反序列化何时发生?

  4. 谢谢

1 个答案:

答案 0 :(得分:2)

首先,不建议在控制器中调用DAO逻辑,最好有一个服务调用DAO逻辑来分离关注点,并能够将每个业务逻辑保留在事务中。

  

book对象被传递给newBook(@RequestBody @Valid Book   它已经序列化了(java.io.Serializable)?要么   序列化发生在bookDao.saveOrUpdate(书)

这不是序列化,这是desirialzation,序列化将java对象转换为序列化格式(如json)而反序列化则相反,反序列化发生在servlet映射器映射请求之后和触发api之前,这就是为什么如果反序列化存在问题,api将不会被触发。

  

序列化是否在书籍持久化之前发生

     

对象?

Hibernate是一个ORM,它将java对象模型映射到关系模型,因此将保留的是jave模型,反序列化发生在控制器级别

  

在上面的例子中,杰克逊是序列化还是反序列化   放置?

我已经回答了反序列化部分,对于序列化,它会在你的控制器返回结果后发生,以防你的api方法有@ResponseBody或你的控制器是一个RestController