findAll from org.springframework.data.jpa.repository.support.SimpleJpaRepository, возвращающий дубликаты - PullRequest
0 голосов
/ 20 октября 2018

Итак, у меня есть хранилище, определенное следующим образом:

public interface PersonRepository extends CrudRepository<Person, Long>

Моя сущность выглядит следующим образом:

@Entity
@Table(name="Person")
public class Person implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name="PERSON_GENERATOR", sequenceName="PERSON_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PERSON_GENERATOR")
private Long id;

@Column(name="ssn")
private String socialSecurityNumber;

private String name;
public Person() {
}

public Long getId() {
    return this.id;
}

public void setId(Long id) {
    this.id = id;
}

Я опустил получатели и установщики для socialSecurityNumber и Name.В базе данных есть 1000 записей.

У меня есть bean-компонент Spring с аннотацией @Component, который использует PersonRepo, вызывая его findAll().Когда вызывается findAll(), я получаю список из 1000 записей с их уникальным идентификатором, однако, когда я перебираю список лиц, возвращенных findAll(), я нахожу неожиданные результаты.

@Component
public class PersonComponent {

    @Autowired
    PersonRepository personRepo;

    public void printPerson() {
        List<Person> people = personRepo.findAll();
        for(Person person : people) {
            System.out.println("id=" + person.getId() + ", ssn=" + person.getSocialSecurityNumber() + ", name=" + person.getName());
        }
    }
}

Так что если в моемУ меня есть записи

id, ssn,  name
 1, ssn1, Bob
 2, ssn2, Mary
 3, ssn3, Joe

, когда я звоню findAll() Я постоянно получаю это обратно

id=1, ssn=ssn1, name=Bob
id=2, ssn=ssn2, name=Mary
id=3, ssn=ssn2, name=Mary

Обратите внимание, что я получаю правильные идентификаторы (т.е. 1, 2, 3) но по какой-то причине идентификатор 3 сопоставлен с ssn2, Мэри и НЕ ssn3, Джо

Это происходит только после первого вызова findAll() (т. е. первый findAll, работает нормально, но последующие, как только показываютповедение объяснено выше).Другими словами, когда приложение запускается, и компонент Spring, который использует PersonRepo, вызывается впервые, findAll(), кажется, работает нормально.Но когда делается последующий вызов Spring Bean, findAll ведет себя как описано.

Наконец, когда я вызываю веб-сервис http://localhost/persons (который вызывает `findAll () под прикрытием), я получаюправильное поведение каждый раз.

Есть мысли?

1 Ответ

0 голосов
/ 22 октября 2018

Проблема, вероятно, связана с отсутствием методов получения и установки для имен и переменных социального обеспечения?После того, как все они объявлены частными, поэтому нам нужен способ доступа к ним, поэтому зачем нужны геттеры?

Я реплицировал ваше приложение, и если вы используете следующее, вам вообще не нужно получать дубликаты.

Файл Appllication.properties:

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/findall_db
spring.datasource.username=YOUR_DATABASE_USERNAME
spring.datasource.password=YOUR_DATABASE_PASSWORD

Java-класс Person Entity:

package com.example.demo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name="Person")
public class PersonInfo implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name="PERSON_GENERATOR", sequenceName="PERSON_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PERSON_GENERATOR")
private Long id;

@Column(name="ssn")
private String socialSecurityNumber;

private String name;



public PersonInfo() {
}



public Long getId() {
    return id;
}



public void setId(Long id) {
    this.id = id;
}



public String getSocialSecurityNumber() {
    return socialSecurityNumber;
}



public void setSocialSecurityNumber(String socialSecurityNumber) {
    this.socialSecurityNumber = socialSecurityNumber;
}



public String getName() {
    return name;
}



public void setName(String name) {
    this.name = name;
}



@Override
public String toString() {
    return "PersonInfo [id=" + id + ", socialSecurityNumber=" + socialSecurityNumber + ", name=" + name + "]";
}

}

Хранилище Person:

package com.example.demo;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PersonInfoRepository extends CrudRepository<PersonInfo, Long>{

}

Контроллер Person:

package com.example.demo;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@Controller
public class PersonController {

    @Autowired
    PersonInfoRepository personRepo;


    @ResponseBody
    @GetMapping("/people")
    public List printPersonInfo() {

           List<PersonInfo> people = (List<PersonInfo>) personRepo.findAll();

           System.out.println(people.toString());

    return people ;

}   


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...