Spring data jpa - Почему сгенерированный SQL содержит неизвестные столбцы, которых нет даже в полях Entity? - PullRequest
0 голосов
/ 12 апреля 2019

Я слежу за этим блогом Влада , чтобы реализовать отношение один-к-одному в ч / б моих двух сущностях User и JobProfile

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name = "user_id", unique = true, nullable = false)
    private Integer userId;

    @Column(name = "unique_id", unique = true, length = 45, updatable = false)
    private String uniqueId;

    @Column(name = "email", unique = true, length = 45, updatable = false)
    private String email;
}


@Entity
@Table(name = "job_profile")
public class JobProfile  {

    @Id
    private Integer id;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private User user;

    @Column(name = "is_looking_job")
    private Boolean isLookingJob;


}

Идея в том, что мой клиент отправит детали работы для пользователя. Данные (я уменьшил для простоты) были бы как: { "isLookingJob": правда }

Контроллер будет отвечать за создание JobProfile для пользователя.

public void saveUserExperience(Principal principal, @RequestBody UserExperienceDto experienceDto) {
        User user = userService.findByEmail(principal.getName());       

        JobProfile jobProfile = new JobProfile();
        jobProfile.setUser(user);

        JobHistory jobHistory = new JobHistory();
        jobHistory.setIsLookingJob(experienceDto.getIsWilling())

        jobProfileDao.save(jobProfile);


    }

JobProfileDao - это интерфейс Spring-Data-Jpa.

public interface JobProfileDao extends JpaRepository<JobProfile, Integer> {

}

Итак, операция сохранения здесь генерирует неправильную команду SQL (insert into job_profile (is_looking_job, is_willing, user_user_id) values (?, ?, ?)) и, следовательно, выдает ошибку could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement

Я очень озадачен, увидев, откуда появился столбец user_user_id.

Я использую загрузку Spring с Spring-data-Jpa + Hibernate для своего проекта.

1 Ответ

1 голос
/ 12 апреля 2019

Вы пропускаете @JoinColumn в поле JobProfile.user, и поэтому hibernate использует user_user_id (на основе имени поля и имени столбца PK в User)

На самом деле, статья, которую вы упоминаете , имеет следующее примечание

Если вы хотите настроить имя столбца первичного ключа при использовании @MapsId, вам нужно использовать аннотацию @JoinColumn. Для более подробной информации, ознакомьтесь с этой статьей.

Как изменить имя столбца общего первичного ключа @OneToOne с помощью JPA и Hibernate

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