2015-04-24 3 views
2

Я начал работать с Spring Data Elasticsearch и найти проблему. Во время пробного пуска, который звонит FindAll() через репозиторий я получаю:Spring Data Elasticsearch требует свойства с именем id

No id property found for class com.example.domain.entity.Project! 

Когда я добавляю поле @Transient private Long id; в моей сущности проекта, то я могу правильно получать результаты. Но я не хочу добавлять это поле, потому что я уже определил первичный ключ с именем projectId. Для этого поля также есть аннотация @Id, так почему мое поле projectId не рассматривается как идентификатор? Похоже, что @Id аннотация не работает для поиска spring-data-elasticsearch, возможно ли это?

Что мне делать, чтобы избежать добавления переходного процесса id в мое лицо? Это больше похоже на временное решение, чем решение ...

Класс проекта:

@Entity 
@Document(indexName = "project_list", type = "external") 
public class Project implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @SequenceGenerator(name = "PROJECT_ID_GENERATOR", sequenceName = "PROJECT_SEQ", initialValue = 100, allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PROJECT_ID_GENERATOR") 
    @Column(name = "PROJECT_ID") 
    private Long projectId; 

    .... other fields and getters/setters 
} 

Repository:

@Repository 
public interface EsProjectRepository extends ElasticsearchRepository<Project, Long> { 

    List<Project> findByName(String name); 
} 

Тест:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath*:test-es-context.xml" }) 
public class ProjectRepositoryTest { 

    @Autowired 
    private EsProjectRepository esProjectRepository; 

    @Test 
    public void shouldGetAllDocuments() { 
     // when 
     Iterable<Project> actuals = esProjectRepository.findAll(); 
     // then 
     assertThat(actuals).isNotEmpty(); 
    } 
} 

конфигурации (тест-эс-контекст. xml):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd"> 

    <context:annotation-config /> 

    <context:property-placeholder location="classpath:test.properties" /> 

    <context:component-scan base-package="com.example.domain.entity, com.example.elasticsearch.*" /> 

    <elasticsearch:repositories base-package="com.example.elasticsearch.repository" /> 

    <elasticsearch:transport-client id="client" cluster-name="${es.cluster}" cluster-nodes="${es.host}:${es.port}" /> 

    <bean name="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate"> 
     <constructor-arg name="client" ref="client"/> 
    </bean> 

</beans> 
+2

Вы можете подтвердить, что @Id - от org.springframework.data.annotation.Id? –

+0

Я использую '@ Id' из javax.persistence.Id; Я согласен с тем, что использование дополнительного '@ Id' из org.springframework разрешает проблему, но все же необходимо, чтобы обе аннотации составляли javax и spring, потому что я использую ее на моей общей модели. – Roman

ответ

1

Используйте этот код и в операторе импорта использовать другой импорт класса Id

@Entity 
@Document(indexName = "project_list", type = "external") 
public class Project implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @org.springframework.data.annotation.Id 
    @SequenceGenerator(name = "PROJECT_ID_GENERATOR", sequenceName = "PROJECT_SEQ", initialValue = 100, allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PROJECT_ID_GENERATOR") 
    @Column(name = "PROJECT_ID") 
    private Long projectId; 

    .... other fields and getters/setters 
} 
0

У нас были аналогичные проблемы. Хотя это, возможно, не идеальное совпадение с тем, что вы пытаетесь сделать, я пришел к этому вопросу в SO, так что это могло бы помочь и другим.

import org.springframework.data.annotation.Id; 

@Id 
private String _id = UUID.randomUUID().toString(); 

 Смежные вопросы

  • Нет связанных вопросов^_^