Я начал работать с 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>
Вы можете подтвердить, что @Id - от org.springframework.data.annotation.Id? –
Я использую '@ Id' из javax.persistence.Id; Я согласен с тем, что использование дополнительного '@ Id' из org.springframework разрешает проблему, но все же необходимо, чтобы обе аннотации составляли javax и spring, потому что я использую ее на моей общей модели. – Roman