您是否使用单一
@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
@Transactionaland 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
@Transactionaland 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



