【问题标题】:Hibernate Search @IndexedEmbedded on a polymorphic relationship (@Any, @ManyToAny)Hibernate Search @IndexedEmbedded 在多态关系上(@Any,@ManyToAny)
【发布时间】:2019-07-09 17:06:29
【问题描述】:

我正在使用 Hibernate Search 并希望索引具有使用 @Any 和/或 @ManyToAny 的多态关系的对象。

@Indexed
public class Foo {
    @Any(metaDef="fooOwnerType", metaColumn=@Column(name="ownerType"))
    @JoinColumn(name="ownerId")
    @IndexedEmbedded // this DOES NOT WORK
    private OwnerType owner;

    @OneToOne
    @IndexedEmbedded // this WORKS
    private User user;

    @OneToOne
    @IndexedEmbedded // this WORKS
    private Company company;

    @Field
    private String description;
}

@Indexed
public class User implements OwnerType {
    @Field
    private String name;

    @Field
    private String address;
}

public class Company implements OwnerType {
    @Field
    private String name;
}    

public interface OwnerType {
}

我可以毫无问题地使用描述字段中的文本搜索和查找 Foo 对象。我还想做的是在 User.name 或 User.address 匹配时找到 Foo 对象......但是由于多态关系 OwnerType 所有者,Hibernate Search 似乎没有为我索引这些字段。

如果我按预期直接在具体对象(用户或公司)上使用@IndexedEmbedded,它会正常工作。

【问题讨论】:

    标签: spring hibernate search spring-data hibernate-search


    【解决方案1】:

    是的,这是意料之中的。 @IndexedEmbedded 只为嵌入字段的公开类型添加字段。目前没有具体的修复计划,但这里有一个功能请求:https://hibernate.atlassian.net/browse/HSEARCH-438 此外,接口不能映射为索引,只有类可以。这将在搜索 6 中修复:https://hibernate.atlassian.net/browse/HSEARCH-1656

    使您的代码正常工作的一种方法是将OwnerType 转换为抽象类,@MappedSuperclass@Entity,并将每个子类共有的字段移到那里。

    编辑:如果用户/公司关联是互斥的(只有一个可以是非空的),另一种使其工作的方法是简单地查询两者。例如,不查询owner.name,而是查询user.namecompany.name 这两个字段。 Hibernate Search DSL 允许:只需使用 .onFields("user.name", "company.name") 而不是 .onField("owner.name")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-21
      • 2020-12-26
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多