object references an unsaved transient instance - save the transient instance before flushing: com.i

最近做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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值