Hibernate Search如何处理从超类继承的注释?

时间:2013-06-14 20:34:44

标签: hibernate lucene hibernate-search

我无法使用这些实体创建正确的索引结构:

@Entity
public class Person implements Serializable {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "person")
    @ContainedIn
    private Set<PersonRole> roles = new LinkedHashSet<>();

    @Field 
    private String firstname;

    // other properties, getter + setter
}

PersonRole

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class PersonRole implements Serializable {

    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "personrolegen")
    @SequenceGenerator(name = "personrolegen", sequenceName = "person_role_id_seq")
    protected Long id;

    @MapsId
    @ManyToOne(optional = false, cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE })
    @IndexedEmbedded(depth = 4)
    protected Person person;
}

人才

@Entity
@Indexed
public class Talent extends PersonRole implements Serializable {
    @Field
    private String email;
}

在此模型中,Person可能包含一个或多个PersonRole个。从历史上看,索引是相反的,即从Talent开始,包括Person。但是,当我部署并保存了几个Talent实例时,查看索引时,人才索引中没有person.firstname(或任何人员属性)。

我也尝试过另一种方式,转换@ContainedIn@IndexedEmbedded,因此在Talent的索引中包含Person,但这也不起作用 - 我个人索引中没有talent.email

我更喜欢历史结构,但是如果有人能指出一种方法可以使另一方向更容易工作,那也是受欢迎的。

Sanne pointed out类似的问题可能只能通过自定义FieldBridge解决,但Hibernate的JIRA对我来说很糟糕,我不知道如何在这里对Talent的属性进行索引(比这里显示的更多,包括几个@IndexedEmbedded)。所以,如果有人可以给我一个解释这个的链接,我也很乐意接受这个。

1 个答案:

答案 0 :(得分:3)

尽管OP的原始问题已经解决,但问题的答案如下:Hibernate Search会将继承的,@Field - 带注释的属性视为该类的属性/字段,并相应地对它们进行索引(超级类的偶数@IndexedEmbedded属性将被编入索引而无需额外的配置/工作量。)