Hibernate中的瞬态方法在MassIndexing时引用代理

时间:2014-01-28 14:39:07

标签: java hibernate hibernate-search

我正在使用MassIndexer索引我的文档。我有一个使用@Transient注释的方法,它引用了一个懒惰的初始化@OneToMany集合,如下所示:

@OneToMany
@JoinColumns({
        @JoinColumn(name = "insertForeignKeyHere", referencedColumnName = "insertPrimaryKeyHere"),... })
@NotFound(action = NotFoundAction.IGNORE)
public Set<AdditionalOption> getAdditionalOptions() {
    return this.additionalOptions;
}

@Transient
@IndexedEmbedded
public Set<AdditionalOption> getActiveAdditionalOptions() {
    Set<AdditionalOption> ret = new HashSet<>();
    //the next line produces the error
    for (AdditionalOption addOpt : this.getAdditionalOptions()) {
        //do stuff.
    }
    return ret;
}

每当我尝试使用MassIndexer索引此文档而没有@OneToMany(fetch = FetchType.EAGER)时,我会遇到以下异常:

org.hibernate.LazyInitializationException:懒得初始化角色集合:&lt; ...&gt;,无法初始化代理 - 没有会话

关于如何在没有EAGER抓取的情况下执行此操作的任何想法? (我有4个或5个集合,如果这不起作用,需要急切的提取 - &gt;巨大的性能问题)

提前致谢。

btw:我正在使用

<hibernate.version>4.3.1.Final</hibernate.version>
<hibernate.search.version>4.5.0.Alpha2</hibernate.search.version>
<lucene.version>3.6.2</lucene.version>

2 个答案:

答案 0 :(得分:2)

尝试使用版本 Hibernate Search 4.5.0.Final :看起来你正在点击我们最近解决的HSEARCH-1260

答案 1 :(得分:0)

如果没有其他方法可以做到这一点,我将使用这种解决方法(使用与第一次发布时不同的bean类)。但我真的不喜欢它。

public static FeatureValueRepository featureValueRepository;
private static final Lock featureValueRepositoryLock = new ReentrantLock();

private static FeatureValueRepository getFeatureValueRepository() {
    featureValueRepositoryLock.lock();
    try {
        if (featureValueRepository == null) {
            //ContextProvider is a custom class in our project
            featureValueRepository = ContextProvider.getContext().getBean(
                    FeatureValueRepository.class);
        }
        return featureValueRepository;
    } finally {
        featureValueRepositoryLock.unlock();
    }
}

然后调用一个按root-bean id查询的方法。