Hibernate Search @IndexedВстраивается в полиморфные отношения (@Any, @ManyToAny) - PullRequest
1 голос
/ 09 июля 2019

Я использую 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, используя текст в поле описания. Я также хотел бы найти объекты Foo, когда совпадают User.name или User.address ... но Hibernate Search, похоже, не индексирует эти поля для меня из-за полиморфных отношений OwnerType owner.

Будет нормально работать, если я буду использовать @IndexedEmbedded на конкретном объекте (пользователь или компания) напрямую, как и ожидалось.

1 Ответ

0 голосов
/ 10 июля 2019

Да, это ожидается. @IndexedEmbedded добавляет только поля для открытого типа встроенного поля. На данный момент нет конкретных планов по ее устранению, но здесь есть запрос на добавление: https://hibernate.atlassian.net/browse/HSEARCH-438 Кроме того, интерфейсы не могут быть отображены для индексации, только классы могут. Это будет исправлено в Поиске 6: https://hibernate.atlassian.net/browse/HSEARCH-1656

Один из способов заставить ваш код работать - это превратить OwnerType в абстрактный класс, либо @MappedSuperclass, либо @Entity, и переместить туда поля, которые являются общими для каждого подкласса.

РЕДАКТИРОВАТЬ: Если ассоциации пользователя / компании являются взаимоисключающими (только одно может быть ненулевым), другой способ заставить это работать - просто запросить оба. Например, вместо запроса owner.name запросите оба поля user.name и company.name. DSL Hibernate Search позволяет: просто использовать .onFields("user.name", "company.name") вместо .onField("owner.name").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...