hibernate中的对象的3种状态的理解及导致报错object references an unsaved transient instance - save the transient instance before flushing异常

  先看下这三篇博文:

object references an unsaved transient instance - save the transient instance before flushing异常问题处理

hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

hibernate中对象的3种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)

  原来的导致报错的代码:

/**
* 详细信息UI
*/
public String showUI() {
if (!StringUtils.isBlank(deviceId)) {
device = deviceService.queryById(deviceId);
}
String deviceTypeName = null;
String deviceTypeNameString ="未知类型";
if(null!= device.getDeviceType()){
deviceTypeName = device.getDeviceType().getName();
deviceTypeNameString = MessageUtils.getMessage(deviceTypeName);
} DeviceType deviceType = new DeviceType();
deviceType.setName(deviceTypeNameString);
device.setDeviceType(deviceType);
if (device != null && device.getDeviceInfos().iterator().hasNext())
deviceInfo = device.getDeviceInfos().iterator().next();
String osNameString ="未知操作系统类型";
if(null != device.getOs()){
if(StringUtils.isNotBlank(device.getOs().getName())){
String osName = device.getOs().getName();
osNameString = MessageUtils.getMessage(osName);
}
}else{
device.setOs(new Os());
}
device.getOs().setName(osNameString);
String ufNameString ="未知设备用途";
if(null!=device.getDeviceUseful()){
if( StringUtils.isNotBlank(device.getDeviceUseful().getName())){
String ufName= device.getDeviceUseful().getName();
ufNameString = MessageUtils.getMessage(ufName);
}
}else{
device.setDeviceUseful(new DeviceUseful());
}
device.getDeviceUseful().setName(ufNameString);
//获取组织机构全路径
Organization organization=device.getOrganization();
if(organization!=null){
String Aname =organization.getName();
String name= getAname(organization, Aname);
device.getOrganization().setName(name);
} return RETURN_SHOWUI;
}

  错误点就在上面代码标红处,估计他这么写的意思就是像把国际化的名称转为汉语,但是这样写就会导致deviceType类中只有name是有值的,其他都是null,所以会报错:org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing:

  考虑可以修改成这样:

public String showUI() {
if (!StringUtils.isBlank(deviceId)) {
device = deviceService.queryById(deviceId);
}
String deviceTypeName = null;
String deviceTypeNameString ="未知类型";
if(null!= device.getDeviceType()){
deviceTypeName = device.getDeviceType().getName();
deviceTypeNameString = MessageUtils.getMessage(deviceTypeName);
device.getDeviceType().setName(deviceTypeNameString);
}else{
device.setDeviceType(new DeviceType());
} if (device != null && device.getDeviceInfos().iterator().hasNext())
deviceInfo = device.getDeviceInfos().iterator().next(); String osNameString ="未知操作系统类型";
if(null != device.getOs()){
if(StringUtils.isNotBlank(device.getOs().getName())){
String osName = device.getOs().getName();
osNameString = MessageUtils.getMessage(osName);
device.getOs().setName(osNameString);
}
}else{
device.setOs(new Os());
} String ufNameString ="未知设备用途";
if(null!=device.getDeviceUseful()){
if( StringUtils.isNotBlank(device.getDeviceUseful().getName())){
String ufName= device.getDeviceUseful().getName();
ufNameString = MessageUtils.getMessage(ufName);
device.getDeviceUseful().setName(ufNameString);
}
}else{
device.setDeviceUseful(new DeviceUseful());
} //获取组织机构全路径
Organization organization=device.getOrganization();
if(organization!=null){
String Aname =organization.getName();
String name= getAname(organization, Aname);
device.getOrganization().setName(name);
} return RETURN_SHOWUI;
}

  这样修改最重要的点就是上面标红处,但是依然有问题,就是当device.getDeviceUseful()等是null的时候,会报上面的异常,还是自由态的影响,所以考虑到放到session里面,到详情页面再直接取即可。

public String showUI() {
if (!StringUtils.isBlank(deviceId)) {
device = deviceService.queryById(deviceId);
}
String deviceTypeName ="未知类型";
if(null!= device.getDeviceType()){
deviceTypeName = MessageUtils.getMessage(device.getDeviceType().getName());
}
getRequest().setAttribute("deviceTypeName", deviceTypeName); if (device != null && device.getDeviceInfos().iterator().hasNext())
deviceInfo = device.getDeviceInfos().iterator().next(); String osName ="未知操作系统类型";
if(null != device.getOs()){
if(StringUtils.isNotBlank(device.getOs().getName())){
osName = MessageUtils.getMessage(device.getOs().getName());
}
}
getRequest().setAttribute("osName", osName); String ufName ="未知设备用途";
if(null!=device.getDeviceUseful()){
if(StringUtils.isNotBlank(device.getDeviceUseful().getName())){
ufName = MessageUtils.getMessage(device.getDeviceUseful().getName());
}
}
getRequest().setAttribute("ufName", ufName); //获取组织机构全路径
Organization organization=device.getOrganization();
if(organization!=null){
String Aname =organization.getName();
String name= getAname(organization, Aname);
device.getOrganization().setName(name);
} return RETURN_SHOWUI;
}

关于hibernate中映射中有many to one等外键关联时的问题的更多相关文章

  1. T-SQL中找出一个表的所有外键关联表

    二种方法(下例中表名为T_Work) 1.SQL查询系统表 SELECT 主键列ID=b.rkey ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.r ...

  2. hibernate5(12)注解映射[4]一对一外键关联

    在实际博客站点中,文章内容的数据量非常多,它会影响我们检索文章其他数据的时间,如查询公布时间.标题.类别的等. 这个时候,我们能够尝试将文章内容存在还有一张表中,然后建立起文章--文章内容的一对一映射 ...

  3. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  4. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  5. Hibernate 再接触 关系映射 一对一单向外键关联

    对象之间的关系 数据库之间的关系只有外键 注意说关系的时候一定要反面也要说通 CRUD 数据库之间设计 主键关联 单向的外键关联 中间表 一对一单向外键关联 Husband.java package ...

  6. Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式 双向关联和单向关联的区别

    首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...

  7. Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式

    首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...

  8. hibernate 关系映射之 单向外键关联一对一

    这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...

  9. hibernate一对一双向外键关联

    一对一双向外键关联:双方都持有对方的外键关联关系. 主控方和一对一单向外键关联的情况是一样的,主要的差异表现为,被空方需要添加: @OneToOne(mappedBy="card" ...

随机推荐

  1. POJ 3977 Subset | 折半搜索

    题目: 给出一个整数集合,求出非空子集中元素和绝对值最小是多少(元素个数尽量少) 题解: 分成两半 爆搜每一半,用map维护前一半的值 每搜出后一半的一个值就去map里找和他和绝对值最小的更新答案 # ...

  2. spring in action 学习笔记十:用@PropertySource避免注入外部属性的值硬代码化

    @PropertySource的写法为:@PropertySource("classpath:某个.properties文件的类路径") 首先来看一下这个案例的目录结构,重点看带红 ...

  3. 在Linux内核中添加系统调用,并编译内核

    1 环境准备 运行系统:vmware下安装的ubuntu10.10 32bit桌面版. 编译内核版本: linux-2.6.32.63 内核目录: /home/wanchouchou/linuxKer ...

  4. jenkins 自定义主题

    一.概述 jenkins更新后,页面css布局都已改变,我现在用的jenkins.css, ( png图片需自定义) #page-body { background-image:url(http:// ...

  5. 静态页面之间的转发与json与ajax做到动态数据

    我们见过很多使用jsp ,php,asp的动态网页技术的网站了,我们知道如果一个网站内容更新频率极低,而内容量不是十分庞大时,这样的网站(一次开发完成后不会需要较多的维护成本)的完全可以使用全部使用静 ...

  6. HDU 1711 Number Sequence---KMP原始

    #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #in ...

  7. linux--lsof

    lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...

  8. 【IDEA】使用intellij的idea集成开发工具中的git插件

    注意:这里并没有介绍git客户端的安装,如果要安装客户端,大家可以参考如下的链接: http://www.runoob.com/git/git-install-setup.html 1.在使用这个id ...

  9. 信号槽库:sigslot.h和sigc++使用

    用qt的知道,qt有方便简单的信号槽机制,但需要专门的qt工具处理. 如果想直接使信号槽就可以使用sigslot库,或者sigc++库,或者boost中的signals,这里介绍sigslot和sig ...

  10. css3实现图片划过一束光闪过效果

    该效果在京东里的图片有. .img { display:block; position: relative; width:800px; height:450px; margin:0 auto; } . ...