【发布时间】:2021-08-11 11:57:09
【问题描述】:
我有一个 Spring Boot 应用程序(Hibernate + JPA),我需要从 PostgreSQL 获取所有课程对象。该对象还包含一个图像。在数据库中,它们像 LOB 一样存储。 @Transactional 仅适用于 ddl-auto:create-drop。
@Transactional
public List<CourseDto> getCourses() {
List<Courses> courses = courseRepositoryDao.findAllByIsCourseFreeAndIsCourseActive(true, true);
List<CourseDto> coursesNameDto = courses
.stream()
.peek(i -> i.setLogo(decompressZLib(i.getLogo())))
.map(course -> modelMapper.map(CourseMapper.toUserDtoFreeCourses(course), CourseDto.class)).collect(Collectors.toList());
System.out.println("**************************" + coursesNameDto + "**********************");
return coursesNameDto;
}
// uncompress the image bytes before returning it to the angular application
public static byte[] decompressZLib(byte[] data) {
Inflater inflater = new Inflater();
inflater.setInput(data);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
byte[] buffer = new byte[1024];
try {
while (!inflater.finished()) {
int count = inflater.inflate(buffer);
outputStream.write(buffer, 0, count);
}
outputStream.close();
} catch (IOException ioe) {
} catch (DataFormatException e) {
}
return outputStream.toByteArray();
}
CourseMapper:
@Component
public class CourseMapper {
public static CourseDto toUserDtoFreeCourses(Courses course) {
return new CourseDto()
.setCourseId(course.getId())
.setCourseName(course.getCourseName())
.setCourseDescription(course.getCourseDescription())
.setCoursePrice(course.getCoursePrice())
.setIsCourseFree(course.getIsCourseFree())
.setIsCourseActive(course.getIsCourseActive())
.setLogo(course.getLogo());
}
如果我不使用@Transactional,我将无法从数据库中获取对象。
即使 ddl-auto 设置为更新,我如何使用 @Transactional? 为什么它不适用于“更新”。
当 ddl-auto 处于更新状态时,来自 POSTMAN 的请求不起作用。
【问题讨论】:
标签: java spring hibernate jpa spring-transactions