繁体   English   中英

TransientObjectException:在刷新之前保存临时实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM