最近做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中去用