Почему JPA возвращает две дубликаты записей при двунаправленном присоединении к двум POJO - PullRequest
0 голосов
/ 19 марта 2019

Я использую Spring Data JPA findAll() для выполнения запроса выбора. Однако этот результат возвращает некоторые повторяющиеся записи, в то время как другие не возвращаются.

У меня есть два POJO Student и Class.

Student POJO:

@SuppressWarnings("serial")
@Entity
@Table(name="model_2", schema="vahanpgi")
public class Student implements Serializable {


    @Column(name="m2_id")
    private String stuId;

    @Id
    @Column(name="m2_des")
    private String classId;

    public String getStuId() {
        return stuId;
    }

    @ManyToOne
    @JoinColumn(name="m2_des",  insertable = false, updatable = false)
    private Class class1;

    public void setStuId(String stuId) {
        this.stuId = stuId;
    }

    public String getClassId() {
        return classId;
    }

    public void setClassId(String classId) {
        this.classId = classId;
    }

    public Class getClass1() {
        return class1;
    }

    public void setClass1(Class class1) {
        this.class1 = class1;
    }
}

и Class POJO:

@SuppressWarnings("serial")
@Entity
@Table(name="model_1", schema="vahanpgi")
public class Class implements Serializable {

    @Id
    @Column(name="m1_id")
    private String classId;

    @Column(name="m1_des")
    private String className;

    @OneToMany(mappedBy="class1")
    private List<Student> student;

    public String getClassId() {
        return classId;
    }

    public void setClassId(String classId) {
        this.classId = classId;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public List<Student> getStudent() {
        return student;
    }

    public void setStudent(List<Student> student) {
        this.student = student;
    }
}

У меня есть две таблицы в базе данных с именами model_1 и model_2:

model_1 стол

   MODEL_1

m1_id    m1_des
cl_1     nur
cl_2     lkg

model_2 стол

  MODEL_2
m2_id    m2_des
stu_1    cl_1
stu_2    cl_1
stu_3    cl_2
stu_4    cl_2

Я запускаю запрос findAll, и моя проблема в том, что я получаю четырех студентов, в которых два студента повторяются с stu_1 и stu_3 ID.

Мой код:

Collection<Student> students= JpaStudent.findAll();
Iterator<Student> stuItr=students.iterator();
while(stuItr.hasNext())
{
    int count=1;
    System.out.println("Student id of student"+ count+ "is:      " +stuItr.next().getStuId());
}

И вот что я получаю:

Student id of student1is:      stu_1
Student id of student1is:      stu_1
Student id of student1is:      stu_3
Student id of student1is:      stu_3

1 Ответ

0 голосов
/ 19 марта 2019

Проблема в том, что вы поместили аннотацию @Id в неправильное поле в Student:

@Id // This is where you put it
@Column(name="m2_des")
private String classId;

Поскольку classId (m2_des) не является уникальным, Hibernate будет тольковерните первую сущность, с которой он сталкивается, с данным ID, в вашем случае:

  • stu_1 (потому что это первая сущность с cl_1)
  • stu_3 (потому что этопервый с cl_2)

Чтобы решить эту проблему, вы должны поместить поле @Id в поле stuId:

public class Student implements Serializable {

    @Id // This field is unique
    @Column(name="m2_id")
    private String stuId;


    @Column(name="m2_des")
    private String classId;

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