Hibernate формирует запрос в котором два раза извлекает id

Рейтинг: 1Ответов: 1Опубликовано: 30.03.2023

Есть три сущности:

@Entity
@Table(name = "departments")
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "department_id", nullable = false)
    private Long id;

    @Column(name = "number", nullable = false, unique = true)
    private Integer number;

    @Column(name = "name", nullable = false, unique = true)
    private String name;

    @OneToMany
    @JoinColumn(name = "department_id")
    private List<Vacancy> vacancies = new ArrayList<>();
}
@Entity
@Table(name = "vacancies")
public class Vacancy {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "vacancy_id", nullable = false)
    private Long id;

    @Column(name = "employee_position", nullable = false)
    private String employeePosition;

    @Column(name = "salary", nullable = false)
    private Long salary;

    @OneToOne
    @JoinColumn
    private Employee employee;
}
@Entity
@Table(name = "employees")
public class Employee {

    @Id
    @Column(name = "personnel_number", nullable = false)
    private Short personnelNumber;

    @Column(name = "firstname", nullable = false)
    private String firstname;

    @Column(name = "lastname", nullable = false)
    private String lastname;

    @Column(name = "patronymic")
    private String patronymic;

    @Column(name = "birth_date")
    private LocalDate birthDate;

    @Column(name = "email", unique = true)
    private String email;

    @Column(name = "telephone_number", unique = true)
    private String telephoneNumber;
}

Hibernate создает таблицы как надо, все работает.
Только вот при получении списка вакансий и выводе в консоль

List<Vacancy> vacancyList = department.getVacancies();

Hibernate формирует запрос, в котором получает vacancy_id два раза

Hibernate: 
    select
        vacancies0_.department_id as departme5_2_0_,
        vacancies0_.vacancy_id as vacancy_1_2_0_,
        vacancies0_.vacancy_id as vacancy_1_2_1_,
        vacancies0_.employee_personnel_number as employee4_2_1_,
        vacancies0_.employee_position as employee2_2_1_,
        vacancies0_.salary as salary3_2_1_,
        employee1_.personnel_number as personne1_1_2_,
        employee1_.birth_date as birth_da2_1_2_,
        employee1_.email as email3_1_2_,
        employee1_.firstname as firstnam4_1_2_,
        employee1_.lastname as lastname5_1_2_,
        employee1_.patronymic as patronym6_1_2_,
        employee1_.telephone_number as telephon7_1_2_ 
    from
        vacancies vacancies0_ 
    left outer join
        employees employee1_ 
            on vacancies0_.employee_personnel_number=employee1_.personnel_number 
    where
        vacancies0_.department_id=?

Зачем и почему он так делает?

Ответы

▲ 1Принят

В сущности Vacancy аннотация @OneToOne с атрибутом @JoinColumn, но вы не указали имя столбца, на который должна быть установлена связь.

Попробуйте указать имя столбца:

@OneToOne
@JoinColumn(name = "personnel_number")
private Employee employee;