Я новичок в 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
Добавлен application.properties к вопросу




Проблема в том, что ваши классы 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;
// ...
Это сработало безупречно! Так много!
Как вы настроили файл Spring Boot
application.propertiesили аналогичный?