我的代码有一个Place和Address类。地址1:N地方。
有一个索引地址索引。
保存地址后,没关系,工作正常。但是当保存地点时,地址索引不会更新。
问题,可能是一个错误: 当@ContainedIn在@EmbeddedId类中的字段上时,这不起作用。实习机制未得到通知,因此索引未发生变化。
我尝试了一些解决方法:
fullTextSession.index(obj)
。 - >不要工作所以,我需要以某种方式完成这项工作,然后我的主要问题是......我怎样才能让它发挥作用?
例如:是否有一些实体机制/类的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);
}
结果:
答案 0 :(得分:2)
手动更新索引fullTextSession.index(obj)。 - &GT;不要工作
如果 无法正常工作,并且您正在通过&#34;地址&#34;对象,它与@Transactional
/ @IndexedEmbedded
无关。
更新实体和索引的代码:
此代码不会更新@ContainedIn
中的places
字段。 Hibernate Search可能正在重新编制索引Address
,但由于当前Hibernate会话中的地址有一个空的Address
字段,所以...
尝试在代码中将新地点添加到places
,它应该有效。