【问题标题】:LazyInitializationException when field is eager字段急切时出现 LazyInitializationException
【发布时间】:2011-03-31 17:23:20
【问题描述】:

我有这样的课程OmQcActivity

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name="OM_QC_ACTIVITY")
public class OmQcActivity{
   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name="STATUS_ID")
   private Codesc status;
}

codesc 是另一个实体。

在我写的代码中:

OmQcActivity  myactivity = findQCActivityById(5);
Codesc status = myactivity.getCodesc();

@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    public OmQcActivity findQCActivityById(Long id) {
        return session.load(persistentClass, id);
    }

但是,我得到:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at com.mycompany.model.OmQcActivity_$$_javassist_11.getStatus(OmQcActivity_$$_javassist_11.java)

如果获取类型是急切的,我如何获得延迟异常?

【问题讨论】:

  • 请显示Codesc代码。

标签: java hibernate


【解决方案1】:

load() 不会立即加载实体,它会返回一个惰性代理,该代理会在第一个方法调用时获取真实数据。大多数情况下,您需要使用get() 而不是load()

【讨论】:

  • @Odelya:在这种情况下,性能没有明显差异。
【解决方案2】:

找到这个link。如果您的 Codesc 实体中有CollectionOfElements 注解,则会引发延迟初始化的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多