关于java:Hibernate Search中的Transient方法在MassIndexing时引用代理

Transient method in Hibernate Search referencing proxy while MassIndexing

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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: 无法延迟初始化角色集合:<...>,无法初始化代理 - 没有会话

关于如何在不获取 EAGER 的情况下执行此操作有什么想法吗? (我有 4 或 5 个集合需要急切地获取,如果这没有不同 -> 巨大的性能问题)

提前致谢。

顺便说一句:我正在使用

1
2
3
<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>

尝试使用 Hibernate Search 4.5.0.Final 版本:您似乎遇到了 HSEARCH-1260,这是我们最近解决的问题。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
    }
}

然后调用一个通过根bean的id查询的方法。