【问题标题】:TransientObjectException: save the transient instance before flushingTransientObjectException:在刷新之前保存瞬态实例
【发布时间】:2013-03-24 13:02:07
【问题描述】:

我目前正在做一个项目,我遇到了这个错误:

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.) 无论我做什么,我总是以上面指定的瞬态错误结束。

有什么想法吗?

【问题讨论】:

  • sessionScopeVariableA 是否也映射为实体?
  • 是的,该应用程序是多租户1,因此在登录时,登录用户需要选择他必须工作的租户,并将其保存在会话范围内。

标签: hibernate jpa jpa-2.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;

【讨论】:

    猜你喜欢
    • 2012-11-08
    • 2012-03-21
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多