2017-09-19 61 views
1

我的代碼有一個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); 
} 

結果:

enter image description here

回答

2

更新索引手動fullTextSession.index(OBJ)。 - >不工作

如果不工作,和你傳遞的「地址」對象,它不涉及到@IndexedEmbedded/@ContainedIn

代碼更新實體和索引:

這個代碼不Address更新places領域。 Hibernate搜索可能會重新索引Address,但由於當前在Hibernate會話中的地址有一個空的places字段,所以...

嘗試添加新的地方Address.places在你的代碼,它應該工作。

+0

謝謝,Yoann!那麼,我需要保存「Place class」旁邊的實體,而不是「Address class」旁邊的實體。因爲我無法保證我的團隊總是通過「地址方」更新地點。有沒有一種方法可以通過「地點」類更新「地址索引」? (Obs:我的場景與其他類一樣,但我用Hsearch doc示例做了一個簡單的項目來模擬它,在相同的情況下) – adyjr

+0

@adyjr不,我不知道如何自動更新非協會的一方。這是一個常見的問題:如果你有雙向關聯,你需要保持雙方都是最新的,否則你最終會遇到麻煩(不僅在Hibernate Search中,而且在業務代碼中)。 –

+0

Yoann是對的,這是使用Hibernate或任何其他JPA實現來始終更新關係兩端的一般要求。有了Hibernate,你可以自動完成這些工作,但前提是你需要啓用實體增強功能,以便在編譯的類中插入必要的代碼。 – Sanne