@ConmbinedId类中的@ContainedIn字段

时间:2017-09-19 12:35:38

标签: hibernate-search

我的代码有一个Place和Address类。地址1:N地方。

有一个索引地址索引

保存地址后,没关系,工作正常。但是当保存地点时,地址索引不会更新。

问题,可能是一个错误: 当@ContainedIn在@EmbeddedId类中的字段上时,这不起作用。实习机制未得到通知,因此索引未发生变化。

我尝试了一些解决方法:

  • 手动更新索引fullTextSession.index(obj)。 - >不要工作
  • Mapped Address超出PlaceID类,可插入且可更新为false。 - >不要工作
  • 我试图研究HSearch的实习机制,试图在Hibernate的PreInsertEventListener / PreUpdateEventListener中解决这个问题。 - >不成功。

所以,我需要以某种方式完成这项工作,然后我的主要问题是......我怎样才能让它发挥作用?

例如:是否有一些实体机制/类的Hibernate Search?我可以在PreInsertEventListener / PreUpdateEventListener(手动方式)中使用,或者像那样思考...

地方代码类:

@Entity
public class Place {

    @IndexedEmbedded
    @EmbeddedId
    private PlaceID id;

    @ContainedIn
    @ManyToOne
    @JoinColumns({ 
        @JoinColumn(name = "address_id", insertable = false, updatable = false, referencedColumnName = "id"),
        @JoinColumn(name = "address_secondId", insertable = false, updatable = false, referencedColumnName = "secondId")
    })
    private Address address;

    @Field(store = Store.YES)
    private String name;
}

地址代码类:

@Indexed
@Entity
public class Address {

    @FieldBridge(impl = AddressIdFieldBridge.class)
    @IndexedEmbedded
    @EmbeddedId
    private AddressID id;

    @Field(store = Store.YES)
    private String street;

    @Field(store = Store.YES)
    private String city;

    @IndexedEmbedded
    @OneToMany(mappedBy = "id.address")
    private Set<Place> places;
}

依赖项的版本:

<hibernate.version>5.2.11.Final</hibernate.version>
<hibernate-search.version>5.8.0.Final</hibernate-search.version>
<lucene.version>5.5.4</lucene.version>

更新实体和索引的代码:

@Test
public void givenPlaces_updateAddressIndex(Address address) {
    List<Place> places = new ArrayList<>();

    for (int i = 0; i < 10; i++) {
        Place place = new Place(new PlaceID((long) new Random().nextInt(500), address));
        place.setName("Place " + new Random().nextInt(500));
        places.add(place);
    }

  placeRepository.save(places);
}

结果:

enter image description here

1 个答案:

答案 0 :(得分:2)

  

手动更新索引fullTextSession.index(obj)。 - &GT;不要工作

如果 无法正常工作,并且您正在通过&#34;地址&#34;对象,它与@Transactional / @IndexedEmbedded无关。

  

更新实体和索引的代码:

此代码不会更新@ContainedIn中的places字段。 Hibernate Search可能正在重新编制索引Address,但由于当前Hibernate会话中的地址有一个空的Address字段,所以...

尝试在代码中将新地点添加到places,它应该有效。

相关问题