Проблемы с весенней загрузкой jooq dao

Я новичок в Java и Spring, и я делаю свой первый отдых. Столкнулся с проблемой, на которую не могу найти ответ.

Я создал сущности, используя Jooq с pojos и daos

            <plugin>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen-maven</artifactId>
            <version>3.16.6</version>
            <executions>
            ...
            </executions>
            <configuration>
                <jdbc>
                    <driver>org.postgresql.Driver</driver>
                    <url>jdbc:postgresql://localhost:5432/spring</url>
                    <user>postgres</user>
                    <password>${env.PGPASSWORD}</password>
                </jdbc>
                <generator>
                    <name>org.jooq.codegen.JavaGenerator</name>
                    <database>
                     ...
                    </database>
                    <target>
                        <packageName>com.example.otrtesttask.jooq</packageName>
                        <directory>target/generated-sources/jooq</directory>
                    </target>
                    <generate>
                        <pojos>true</pojos>
                        <daos>true</daos>
                        <records>true</records>
                    </generate>
                </generator>
            </configuration>
        </plugin>

Моя структура базы данных:

CREATE TABLE branch(id    SERIAL PRIMARY KEY, title VARCHAR(100));

CREATE TABLE position(id    SERIAL PRIMARY KEY, title VARCHAR(30));

CREATE TABLE employee
(
    id          SERIAL PRIMARY KEY,
    manager_id  INTEGER REFERENCES employee (id),
    position_id INTEGER REFERENCES position (id) NOT NULL,
    full_name   VARCHAR(50)                      NOT NULL,
    branch_id   INTEGER REFERENCES branch (id)   NOT NULL);

CREATE TABLE task
(
    id          SERIAL PRIMARY KEY,
    priority    SMALLINT                     NOT NULL,
    description VARCHAR(200)                 NOT NULL,
    employee_id INT REFERENCES employee (id) NOT NULL);

Затем я сделал контроллер, который вызывает службу, которая вызывает репозиторий, для запуска операций CRUD. И это прекрасно работает, но я хочу получить название позиции вместе с идентификатором и т. д. Поэтому я сделал DTO:

@Data
public class EmployeeDto {
    private Integer id;
    private Integer managerId;
    private Integer positionId;
    private String fullName;
    private Integer branchId;
    private Employee manager;
    private Position position;
    private Branch branch;
}

После этого я сделал маппер, который конвертирует Employee в EmplieeDto. Мне сказали, что лучший способ получить вложенные данные (например, название должности) — использовать функцию DAO fetchOnyById.

@Service
public class MappingUtils {
    EmployeeDao employeeDao = new EmployeeDao();
    PositionDao positionDao = new PositionDao();
    BranchDao branchDao = new BranchDao();

    public EmployeeDto mapToEmployeeDto(Employee employee) {
        EmployeeDto dto = new EmployeeDto();

        dto.setId(employee.getId());
        dto.setBranchId(employee.getBranchId());
        dto.setPositionId(employee.getPositionId());
        dto.setFullName(employee.getFullName());
        dto.setManagerId(employee.getManagerId());

        dto.setManager(employeeDao.fetchOneById(employee.getManagerId()));
        dto.setPosition(positionDao.fetchOneById(employee.getPositionId()));
        dto.setBranch(branchDao.fetchOneById(employee.getBranchId()));
        return dto;
    }

И я сопоставляю объекты внутри репозитория следующим образом:

   @Repository
   @RequiredArgsConstructor
   public class EmployeeRepository {
        @Autowired
        private final DSLContext dsl;
        private final MappingUtils mappingUtils;
        public List<EmployeeDto> findAll(Condition condition) {
            return dsl.selectFrom(Tables.EMPLOYEE)
                    .where(condition)
                    .fetchInto(Employee.class)
                    .stream().map(mappingUtils::mapToEmployeeDto)
                    .collect(Collectors.toList());
        }
    }

И работает нормально, пока не доберется до функции dao fetch. Выдает исключение org.jooq.exception.DetachedException: Cannot execute query. No JDBC Connection configured. Как только я удаляю функции dao, запрос на получение возвращает хороший ответ с менеджером, позицией и ветвью, установленными на ноль.

Что я здесь делаю неправильно? А как обеспечить необходимое подключение?

==UPD== Мое приложение.Свойства:

spring.datasource.url=jdbc:postgresql://localhost:5432/spring
spring.datasource.username=postgres
spring.datasource.password=${PGPASSWORD}
spring.liquibase.change-log=classpath:liquibase/changelog.sql

Как вы настроили файл Spring Boot application.properties или аналогичный?

Lukas Eder 16.05.2022 09:12

Добавлен application.properties к вопросу

True Seeker 16.05.2022 10:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что ваши классы DAO не привязаны к jOOQ Configuration. Вы только что создали их так:

EmployeeDao employeeDao = new EmployeeDao();

Но вы должны создать их следующим образом:

EmployeeDao employeeDao = new EmployeeDao(configuration);

Вы также можете настроить генератор кода для генерации аннотаций Spring, а затем внедрить DAO в свой класс. Конфигурация будет:

<configuration>
  <generator>
    <generate>
      <springAnnotations>true</springAnnotations>
      <!-- ... -->

А потом:

@Service
public class MappingUtils {
    @Autowired
    EmployeeDao employeeDao;
    @Autowired
    PositionDao positionDao;
    @Autowired
    BranchDao branchDao;
    // ...

Это сработало безупречно! Так много!

True Seeker 16.05.2022 11:02

Другие вопросы по теме

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