object references an unsaved transient instance

来源:互联网 发布:web 开发语言 知乎 编辑:程序博客网 时间:2024/05/16 18:48

最近做SSH整合,在新建管理员的时候,出现如下错误:

Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: AdminRole

org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: AdminRole;

nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: .AdminRole

因为管理员中有个属性关联着角色表,所以就出现了这个异常。

根本原因是以为:我在Controller中先把AdminRole对象查了出来,然后再SET到Admin对象对应的属性中,而session的范围是在spring管理的范围之内(我们一般分spring的配置文件和springmvc的配置文件,spring中管理这除了controller之外的对象,而hibernate的配置和事物的配置,都是在spring配置文件的范围之内的,不包含在springmvc中),所以查出来的AdminRole对象,放到controller中,它就已经变成了临时状态而不是持久化状态,所以就出现了这个问题

参考了很多网上说的设置:cascade属性,谁负责管理外键等,都不行,最后是具体分析了异常的含义,以及之前类似这种spring,springmvc配置特性的作用域范围,才最终确定了问题所在。

由此我们可以引申出三层架构和spring,springmvc;
平常我们为什么要分三层架构,而springmvc负责V层,所以很多特性不应该在V层中有(V层有自己的特殊特性,比如视图解析,静态资源等方面),而是在业务层和数据层。

以后注意这个问题:在spring容器内设置的特性,不要到springmvc中去用

阅读全文
0 0
原创粉丝点击