【问题标题】:Bidirectioal search in Hibernate SearchHibernate Search 中的双向搜索
【发布时间】:2014-05-05 07:48:42
【问题描述】:

我在使用 Hibernate Search 的应用程序中遇到了问题。

我们有一个类 A,我们在其中对 A 类和 B 类中的字段进行 hsearch,并且还针对 A 中声明的类地址进行空间搜索。 一切正常。

现在我们还必须以相反的方式实现搜索,我们要在 B 类中搜索 B、A 中包含的字段,并针对 A.Address 进行空间搜索。现在我们有一个问题。自从 B 将 A 声明为 @ContainedIn,A 的字段无法从 B 中搜索。 如果我们将@ContainedIn 更改为@IndexEmbedded,我们会得到循环依赖,因为你不能在两边都有@IndexEmbedded。 然后我读到你可以限制@IndexEmbedded 的深度,所以我试了一下。我知道我们不会搜索比 A.?.?.? 更深的地方。在 B 所以我将@ContainedIn 更改为 @IndexEmbedded(depth = 4) B 类 A 类。

现在当我启动我的应用程序时,我收到以下错误:

org.hibernate.search.SearchException:HSEARCH000158:类地址 不能有两个使用默认/相同名称的@Spatial

有没有人知道如何解决这个问题? 我们使用 Hibernate Search 版本 4.5.0.Final 请参阅以下课程。 问候 安德烈亚斯

@Entity
@Indexed
@FullTextFilterDefs({
        @FullTextFilterDef(name = "externalSearchFilterFactory", impl = ExternalSearchFilterFactory.class),
        @FullTextFilterDef(name = "internalSearchFilterFactory", impl = InternalSearchFilterFactory.class)
})
@DynamicUpdate(value = true)
@Table(name = "A")
public class A extends DomainObjekt {

    .....

    @IndexedEmbedded
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, optional = false)
    @JoinColumn(name = "B_ID", referencedColumnName = "B_ID", nullable = false)
    private B b;

    @IndexedEmbedded
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, optional = false)
    @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ADDRESS_ID", nullable = false)
    private Address adress;

    .....

} 


@Entity
@Indexed
@DynamicUpdate(value = true)
@Table(name = "B")
public class B extends DomainObjekt {

    .....

    @ContainedIn
    @OneToMany(mappedBy = "b", fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    private Set<A> listOfA = new HashSet<A>();

    .....
}

@Spatial(name = "location", spatialMode = SpatialMode.RANGE)
@Indexed
@Entity
@DynamicUpdate(value = true)
@Table(name = "ADDRESS")
@SuppressWarnings({"serial"})
public class Address extends DomainObjekt {

    .....

    @Latitude(of = "location")
    @Column(name = "LATITUDE")
    private Double latitude;

    @Longitude(of = "location")
    @Column(name = "LONGITUDE")
    private Double longitude;

    .....
}

【问题讨论】:

  • 我解决了这个问题。通过在 A 类中使用 includePaths 并仅命名我感兴趣的字段,我摆脱了导致问题的循环依赖。

标签: hibernate hibernate-search


【解决方案1】:

@Spatial 注释采用 name 属性。 当您想在同一个实体中拥有多个空间字段时,您应该使用此属性,以便在进行查询时可以指向特定的空间字段。

【讨论】:

  • 我已经试过了,结果一样。问题是我正在搜索一个对象列表,正如您在上面看到的,每个对象都包含一个地址,这似乎不起作用。我必须通过创建自己的类来根据 Haversine 公式计算距离来解决问题,并且我在过滤器中使用它而不是使用 Hibernate Spatial serach。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
相关资源
最近更新 更多