![](/img/trans.png)
[英]Saving lazy child is causing: TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing
[英]TransientObjectException: save the transient instance before flushing
我目前正在处理一个项目,遇到了以下错误:
org.hibernate.TransientObjectException: object references an unsaved transient instance – save the transient instance before flushing
发生了什么:1.)我有一个登录后设置的会话范围变量,假设为SessionScopeVariableA。
2)然后,我在其中添加实体的页面,即EntityA。
3.)EntityA有一个惰性字段sessionScopeVariableA,因此,当我调用add方法时,必须设置此变量。
entityA.setSessionScopeVariableA(sessionScopeVariableA);
em.persist(entityA);
4.)请注意,当操作为对话范围时,SessionScopeVariableA包装在会话范围生成器中。
5.)无论我做什么,我总是会遇到上面指定的瞬态错误。
任何想法?
解决此问题的方法是使用焊料管理与CDI的连接资源。 这是我们这样做的方式:
//租户的限定词
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
public @interface CurrentTenant { }
//producer for the current tenant
@Produces
@Named("currentTenant")
@CurrentTenant
public Provider getCurrentTenant() { //.. }
//在单独的util类中,定义要如何管理连接资源(cdi)
@ExtensionManaged
@ConversationScoped
@Produces
@PersistenceUnit(unitName="myEM")
@MyEMJpa
private EntityManagerFactory em;
//连接资源的接口
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
public @interface MyEMJpa { }
//在服务中注入实体管理器
@Inject
@MyEMJpa
protected EntityManager em;
//如何注入当前租户
@Inject
@CurrentTenant
private Provider currentTenant;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.