Hibernate Search中的双向搜索

时间:2014-05-05 07:48:42

标签: hibernate hibernate-search

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

我们有一个类,A我们对A类和B类中的字段进行搜索,还有空间搜索agaist类在A中声明的地址。 一切都很好。

现在我们必须以相反的方式实现搜索,我们想要在B类中搜索B,A中包含的字段和针对A.Address的空间搜索。现在我们遇到了问题。以来 B的A声明为@ContainedIn,A的字段不能从B中搜索到。 如果我们将@ContainedIn更改为@IndexEmbedded,我们就会获得循环依赖,因为您不能在@IndexEmbedded双方都拥有@IndexEmbedded。 然后我读到你可以限制@ContainedIn的深度,所以我尝试了。我知道我们不会比A更深入地搜索。?。?。?在B中,我将@IndexEmbedded(depth = 4)更改为 B级的A级@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; ..... }

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

  

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

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

{{1}}

1 个答案:

答案 0 :(得分:0)

@Spatial 注释采用名称属性。 如果要在同一实体中包含多个空间字段,则应使用此属性,以便在执行查询时可以指向特定的空间字段。