@Nulltiton

Почему при выводе на форму не подтягивается связанный объект из БД?

На форму выводится информация о водителях:
<table class="table table-bordered">
    <thead>
        <tr>
            <th>#</th>
            <th>Id пользователя</th>
            <th>Имя</th>
            <th>Фамилия</th>
            <th>Отчество</th>
            <th>Дата рождения</th>
            <th>Номер телефона</th>
            <th>Организация</th>
            <th>Серия-номер прав</th>
            <th>Действия</th>
        </tr>
    </thead>
    <tbody>
        <tr class="Authors-item" th:each="driver : ${drivers}">
            <td th:text="${driver.id}">Id</td>
            <td th:text="${driver.username}">Username</td>
            <td th:text="${driver.userInfo.firstName}">Name</td>
            <td th:text="${driver.userInfo.middleName}">Second name</td>
            <td th:text="${driver.userInfo.lastName}">Last name</td>
            <td th:text="${driver.userInfo.birthDate}">Birthday</td>
            <td th:text="${driver.userInfo.phoneNumber}">Number</td>
            <td th:text="${driver.organization}? ${driver.organization.name} : 'Без организации'">Organization</td>
            <td th:text="${driver.userInfo.licenseSeries + ' - ' + driver.userInfo?.licenseNumber}">Date</td>
            <td>
                <a th:href="@{/drivers/edit/{id}(id=${driver.id})}" href="#">Редактировать</a>
                <a th:href="@{/drivers/delete/{id}(id=${driver.id})}" href="#">Удалить</a>
           </td>
       </tr>
   </tbody>
</table>


Запрос обрабатывается следующим методом:
@GetMapping({"/index", "/", ""})
    public String showMainPage(Model model) {
        model.addAttribute("drivers", driverService.getDrivers());
        return "/drivers/index";
    }


Метод driverService:
public List<User> getDrivers() {
        return userRepository.findUserByAuthoritiesIn(Collections.singleton(roleRepository.findByAuthority("DRIVER").get()));
    }

Который возвращает записи, однако в поле userinfo по какой-то причине null. roleRepository.findByAuthority("DRIVER").get() возвращает нужные роли, поиск по ним в userRepository.findUserByAuthoritiesIn действительно ведется и данные выдаются, однако userinfo - null. Таблицы связаны 1 к 1.
User:
@Entity
@Table(name = "user")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User extends BaseEntity<Long> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 100, nullable = false, unique = true)
    private String username;

    @Email
    @Column(length = 100, nullable = false, unique = true)
    private String email;

    @Column(length = 100, nullable = false)
    private String password;

    @Column(nullable = false)
    private Boolean enabled;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    @JoinColumn(name = "organization_id")
    private Organization organization;

    @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    @JoinColumn(name = "id")
    private UserInfo userInfo;

    @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JoinTable(
            name = "user_role",
            joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")}
    )
    private Set<Role> authorities = Collections.emptySet();
}


UserInfo:
@Entity
@Table(name = "user_info")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo extends BaseEntity<Long> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    @Column(length = 100)
    private String firstName;

    @Column(length = 100)
    private String middleName;

    @Column(length = 100)
    private String lastName;

    @Column(name = "birth_dt")
    private Date birthDate;

    @Column(length = 100)
    private String phoneNumber;

    @Column(length = 4)
    private String licenseSeries;

    @Column(length = 6)
    private String licenseNumber;
}

Грешу на связи, но не могу найти ошибку, подскажите, в чем может быть дело?
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Spring
Java Software Engineer
Добрый день.

@OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    @JoinColumn(name = "id")
    private UserInfo userInfo;


Так у вас FetchType.LAZY, потому данные и не подтягиваются. А OSIV у вас включен или отключен?

P.S. не передавайте на фронт саму сущность. Используйте DTO.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы