6

मैंने वसंत बूट 1.3.1 पर स्प्रिंग डेटा लोचदार खोज के साथ काम करना शुरू किया और मैं उसी डेटाबेस का उपयोग करना चाहता हूं जो मेरे डेटाबेस में उपयोग करता है, और इसमें कंपाउंड कुंजी है।यह संभव है कि परिसर कुंजी के साथ वसंत-डेटा-लोचदार खोज @ दस्तावेज़ बनाएं?

इकाई वर्ग:

@IdClass(PassengerPk.class) 
@Table(name = "passenger") 
@Document(indexName="passenger") 
public class Passenger implements Serializable { 

    @Id 
    @ManyToOne 
    @JoinColumn(columnDefinition="long", name="user_id", referencedColumnName="id") 
    private User user; 

    @Id 
    @ManyToOne 
    @JoinColumn(columnDefinition="long", name="scheduler_id", referencedColumnName="id") 
    private Scheduler scheduler; 

    @Column(name = "is_active") 
    private Boolean isActive; 

    ... 
} 

कुंजी वर्ग:

public class PassengerPk implements Serializable { 

    private Long user; 
    private Long scheduler; 

    public PassengerPk() { 
    } 

    public PassengerPk(Long user, Long scheduler) { 
     this.user = user; 
     this.scheduler = scheduler; 
    } 
    ... 
} 

जेपीए Elasticsearch भंडार:

public interface PassengerSearchRepository extends ElasticsearchRepository<Passenger, PassengerPk> { 

} 

डेटाबेस: database relationships

अगर मैं इस कोड को संकलित करने का प्रयास करता हूं, तो मुझे यह त्रुटि मिलती है।

Caused by: java.lang.IllegalArgumentException: Unsuppored ID type class com.dualion.test.domain.PassengerPk 
    at org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactory.getRepositoryBaseClass(ElasticsearchRepositoryFactory.java:79) ~[spring-data-elasticsearch-1.3.1.RELEASE.jar:na] 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepositoryInformation(RepositoryFactorySupport.java:238) ~[spring-data-commons-1.11.1.RELEASE.jar:na] 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:181) ~[spring-data-commons-1.11.1.RELEASE.jar:na] 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:251) ~[spring-data-commons-1.11.1.RELEASE.jar:na] 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:237) ~[spring-data-commons-1.11.1.RELEASE.jar:na] 
    at org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactoryBean.afterPropertiesSet(ElasticsearchRepositoryFactoryBean.java:55) ~[spring-data-elasticsearch-1.3.1.RELEASE.jar:na] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    ... 71 common frames omitted 

मैं अपना कोड कैसे संशोधित कर सकता हूं?

धन्यवाद

+0

कोई भी मुझे समाधान दे सकता है? – kn4ls

+0

आप '@ IdClass' निर्भरता का उत्तराधिकारी कैसे प्राप्त करते हैं?मुझे लगता है कि यह कुछ जेपीए निर्भरता द्वारा लाया गया एक वर्ग है, जेपीए के साथ ईएस कॉन्फ़िगर करने के लिए इतना छोटा नहीं है, मुझे नहीं पता कि कैसे। तो निश्चित रूप से आप इसे ES के लिए उपयोग नहीं कर सकते हैं। मेरे लक्ष्य को प्राप्त करने के तरीके के बारे में जानने के लिए मेरे लिए बहुत उपयोगी होगा। – andPat

+0

अंत में हाइबरनेट खोज का उपयोग करें और ईएस नहीं, बीकॉज़ कार्यान्वयन यह अधिक आसान है। – kn4ls

उत्तर

0

मैं कहीं और संबंधित उत्तर पढ़ा था और निष्कर्ष निकाला था यह संभव नहीं था, हालांकि, मेरी जिद्दीपन ने मुझे सबसे अच्छा पाया और मैंने एक समाधान निकाला।

टीएलडीआर; वसंत को एक नई रिपोजिटरी का उपयोग करने के लिए मजबूर करें जो आपकी समग्र आईडी का हैशकोड लेता है और इसके स्ट्रिंग मान का उपयोग आईडी के रूप में करता है।

कदम ...

एक नया Repository कि समग्र आईडी संभाल कर सकते हैं बनाएँ:

public class HashKeyedRepository<T, ID extends Serializable> extends AbstractElasticsearchRepository<T, ID> { 

    public HashKeyedRepository() { 
     super(); 
    } 

    public HashKeyedRepository(ElasticsearchEntityInformation<T, ID> metadata, 
           ElasticsearchOperations elasticsearchOperations) { 
     super(metadata, elasticsearchOperations); 
    } 

    public HashKeyedRepository(ElasticsearchOperations elasticsearchOperations) { 
     super(elasticsearchOperations); 
    } 

    @Override 
    protected String stringIdRepresentation(ID id) { 
     return String.valueOf(id.hashCode()); 
    } 
} 

नोट इस मानता है कि है कि आप अपने समग्र आईडी वर्ग पर .hashCode को लागू किया है सही ढंग से काम करने के लिए।

@EnableElasticsearchRepositories(basePackages = "xxx.xxx.repository.search", repositoryFactoryBeanClass = CustomElasticsearchRepositoryFactoryBean.class) 

इस कार्यान्वयन वापस गिर जाता है:

public class CustomElasticsearchRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends ElasticsearchRepositoryFactoryBean<T, S, ID> { 

    private ElasticsearchOperations operations; 

    public CustomElasticsearchRepositoryFactoryBean(Class<? extends T> repositoryInterface) { 
     super(repositoryInterface); 
    } 

    public void setElasticsearchOperations(ElasticsearchOperations operations) { 
     super.setElasticsearchOperations(operations); 
     Assert.notNull(operations);  
     this.operations = operations; 
    } 

    @Override 
    protected RepositoryFactorySupport createRepositoryFactory() { 
     return new ElasticsearchRepositoryFactory(operations) { 
      @Override 
      protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) { 
       if (!Integer.class.isAssignableFrom(metadata.getIdType()) && !Long.class.isAssignableFrom(metadata.getIdType()) && !Double.class.isAssignableFrom(metadata.getIdType()) && metadata.getIdType() != String.class && metadata.getIdType() != UUID.class) { 
        return HashKeyedRepository.class; 
       } 
       return super.getRepositoryBaseClass(metadata); 
      } 
     }; 
    } 
} 

अंत में, जब अपने खजाने को सक्षम करने, निर्दिष्ट अपने नए RepositoryFactoryBean वर्ग:

इसके बाद आप एक नया RepositoryFactoryBean है कि इस नए Repository वापस आ जाएगी बनाने के लिए डिफ़ॉल्ट रूप से यदि इस लेखन के रूप में समर्थित आईडी में से कोई भी इसके बजाय उपयोग किया जाता है (यानी स्ट्रिंग, यूयूआईडी, संख्या)। मुझे नहीं पता कि यह एक महान समाधान है कि हशकोड के साथ संघर्ष की संभावनाएं हैं लेकिन यह अभी मेरे लिए काम कर रही है।

पुनश्च मैं lombok रों ऑटो को @Data मेरे लिए .hashCode उत्पन्न उपयोग कर रहा हूँ।

पी पी एस एक अन्य समाधान मैंने देखा है दूसरों (गैर जावा) का उल्लेख base64 आईडी (अर्थात JSON) के एक धारावाहिक संस्करण एन्कोड करना है। मुझे लगता है कि यह किसी भी विवाद की गारंटी नहीं देगा लेकिन आपको किसी भी अतिरिक्त पात्रों (यानी व्हाइटस्पेस) को पट्टी करना सुनिश्चित करना होगा और इसके लिए गुणों की गारंटी गारंटी होगी।

संबंधित मुद्दे