我的代碼有一個Place和Address類。地址1:N地點。@ContainedIn @EmbeddedId裏面的字段
有一個索引,地址索引。
當地址被保存,沒關係,工作正常。但是當地方保存時,地址索引不會更新。
問題,也許是一個錯誤: 當@ContainedIn在@EmbeddedId類的字段上時,這是行不通的。實習機制沒有通知,因此索引不變。手動fullTextSession.index(obj)
- 更新的索引:
我已經嘗試了一些解決方法。 - >不起作用
- 映射AddressID類的地址,可插入和可更新爲false。 - >不工作
- 我試圖研究HSearch的實習機制,試圖解決Hibernate的PreInsertEventListener/PreUpdateEventListener內部的這個問題。 - >失敗。
所以,我需要以某種方式使這項工作,那麼我的主要問題是...我如何使它的工作?
例如:是否有一些實習機制/類的Hibernate搜索?我可以一個PreInsertEventListener/PreUpdateEventListener(手動方式)的內部使用或somethink這樣...
代碼地點類:
@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);
}
結果:
謝謝,Yoann!那麼,我需要保存「Place class」旁邊的實體,而不是「Address class」旁邊的實體。因爲我無法保證我的團隊總是通過「地址方」更新地點。有沒有一種方法可以通過「地點」類更新「地址索引」? (Obs:我的場景與其他類一樣,但我用Hsearch doc示例做了一個簡單的項目來模擬它,在相同的情況下) – adyjr
@adyjr不,我不知道如何自動更新非協會的一方。這是一個常見的問題:如果你有雙向關聯,你需要保持雙方都是最新的,否則你最終會遇到麻煩(不僅在Hibernate Search中,而且在業務代碼中)。 –
Yoann是對的,這是使用Hibernate或任何其他JPA實現來始終更新關係兩端的一般要求。有了Hibernate,你可以自動完成這些工作,但前提是你需要啓用實體增強功能,以便在編譯的類中插入必要的代碼。 – Sanne