【问题标题】:@Transactional doesn't work when fetching an image from PostreSQL with ddl-auto: update使用 ddl-auto 从 PostgreSQL 获取图像时,@Transactional 不起作用:更新
【发布时间】: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


    【解决方案1】:

    我怀疑这与ddl-auto 有关。您并没有真正指定“不起作用”的确切含义,因此我只能猜测。

    问题可能是,您使用.peek(i -&gt; i.setLogo(decompressZLib(i.getLogo()))) 在流级联中操作实体。这可能不是你想要的。您应该在映射步骤中解压缩图像,以便未压缩的数据不会写回Courses 实体,而是写回CoursesDto

    编辑:直接在控制器中解压,也可以在mapper中解压:

    .setLogo(decompressZLib(course.getLogo()))
    

    为此,您还需要将解压方法放入映射器中。

    【讨论】:

    • 不起作用意味着当我要更新 ddl-auto 时,我通过 POSTMAN 获取课程的请求不起作用。它仍处于等待状态,并显示 ms“正在发送请求...”
    • 即使将 ddl-auto 设置为 create-drop,在 2 次成功请求后,Postman 也会崩溃
    • 如果你想打一个缩放电话,请告诉我
    • 只有 2 个请求我可以通过 Postman 发送,之后它仍然等待“发送请求...”
    • 我找到了问题:.peek(i -> i.setLogo(decompressZLib(i.getLogo())))。但是如何解压图片呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2018-07-12
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多