栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

对象引用未保存的瞬态实例:如何刷新或返回保存的对象

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

对象引用未保存的瞬态实例:如何刷新或返回保存的对象

您是否使用单一

@Transactional
方法进行编码?
如果不是这样,那么问题可能出在调用服务方法之后,将提交事务并清除会话。当您尝试保存实体时,在会话中未检测到语言对象,而是将其作为临时实例进行管理并给出错误。

如果您的代码在单个事务下,您是否尝试过一个

flush()
保存前实体来强制Hibernate存储
Language
到数据库并为其分配有效的
@Id
标识符?

毕竟-恕我直言-如果您对实体和语言有依赖性,最好的选择是:

@ManyToOne(cascade = CascadeType.ALL)private Language language;

并将代码更改为:

e=new EntityX();Language lang = new Language();// ...e.setLanguage(lang);otherService.saveEntity(e);

而且您不需要分两个步骤来持久化实体(语言+实体);将语言和实体作为单个项目进行管理

PS
:org.hibernate.Session的save(…)方法不会返回已保存的对象,因为该对象将保持不变(引用不变),只是对象属性发生了变化(例如标记为this的对象)

@Id

例如)!

EDIT:
Make an object persistent (session.save() it I mean) don’t result in a
immediate insert/update; without cascade hint Hibernate look doesn’t detect
dependency between EntityX and Language and doesn’t perform a sql insert of
Language before saving EntityX.
languageService.save(language) call doesn’t perform session.flush() because
you are under same

@Transactional
and without session.commit() no
session.flush() is performed and best option is that Language object is still
marked as transient.
You can do a check: extract services save pre (language entityX) and put all
in single
@Transactional
and check if Hibernate still give you error.
My best option is still perform a flush() in the middle or change your
mapping, no other way



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/397751.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号