我正在处理一个项目,但我遇到了这个错误:
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.)无论我做什么,我总是最终得到上面指出的瞬态错误。
有什么想法吗?
答案 0 :(得分:1)
解决了这个问题的原因是使用焊接来管理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;