3

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

@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
}

人物角色

@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;
}

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

我也尝试过相反的工作,切换@ContainedInand @IndexedEmbedded,从而包括TalentinPerson的索引,但这也不起作用 -talent.email在我的人员索引中没有。

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

Sanne指出,类似的问题可能只能通过自定义 FieldBridge 解决,但 Hibernate 的 JIRA 对我来说已经失败,我不知道如何索引这里的属性(Talent这里显示的远不止于此,包括几个@IndexedEmbedded)。因此,如果有人可以给我一个链接来解释这一点,我也很乐意接受。

4

1 回答 1

3

尽管 OP 的原始问题已经解决,但问题的答案如下: Hibernate Search 会将继承的、@Field带注释的属性视为该类的属性/字段,并将相应地对它们进行索引(甚至@IndexedEmbedded超类的属性也会被索引)无需额外的配置/努力)。

于 2013-06-18T15:56:05.007 回答