当前位置: 首页 > 知识库问答 >
问题:

将@事务方法结果从服务传递到控制器层Spring Boot

谭铭
2023-03-14

我试着从服务中获得一个多人关系(课程-学生),并将结果传递给管理员。当我在服务中时,由于事务性注释,没有抛出懒散的初始化异常(LazyInitializationException)。但是,当我在控制器中时,会抛出懒散初始化异常(在获取课程学生时),因为会话已关闭。我如何解决此问题,而不急于获取集合

这是我的代码

Couse Model

@Entity
@Getter
@Setter
public class Course {

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

    @Column
    private String name;

    @ManyToMany
    @JoinTable(name = "COURSES_STUDENTS",
            joinColumns = {@JoinColumn(name = "COURSE_ID")},
            inverseJoinColumns = {@JoinColumn(name = "STUDENT_ID")})
    private Set<Student> students;

    public Course() {
        this.students = new HashSet<>();
    }

学生模型

@Entity
@Getter
@Setter
public class Student {

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

    @Column
    private String name;

    @ManyToMany(mappedBy = "students")
    private Set<Course> courses;

    public Student() {
        this.courses = new HashSet<>();
    }
}

课程存储库

@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
}

课程服务

@Service
public class CourseService {

    private final CourseRepository courseRepository;

    @Autowired
    public CourseService(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

    @Transactional
    public ResponseEntity<List<Course>> findAll() {
        return this.courseRepository.findAll().isEmpty() ? ResponseEntity.noContent().build()
                : ResponseEntity.ok(this.courseRepository.findAll());
    }
}

航向控制员

@Controller
@RequestMapping("/")
public class CourseController {

    private final CourseService courseService;

    @Autowired
    public CourseController(CourseService courseService) {
        this.courseService = courseService;
    }

    @GetMapping
    public ResponseEntity<List<Course>> index() {
        return this.courseService.findAll();
    }
}

应用属性

spring.datasource.url=jdbc:h2:~/database;AUTO_SERVER=TRUE
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.jpa.open-in-view=false
spring.mvc.hiddenmethod.filter.enabled=true
logging.level.org.springframework.web=DEBUG
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

提前感谢。

共有1个答案

濮阳研
2023-03-14

因此有两种方法:

  1. 这个Spring是什么。jpa。在视图中打开=Spring Boot中的true属性

这对性能不利,必须不惜一切代价避免。

总之,不要使用事务性来保持db会话打开以获取延迟集合。只需在db/dao层中加入fetch lazy集合,即可获得每个endpoint所需的数据。

如果您想在这里了解如何使用join-fetch-how-FetchType。Spring控制器中与JPA和Hibernate的惰性关联

 类似资料:
  • 问题内容: 我有以下控制器: 我想将绑定的ng模型传递给以下服务,该模型位于我的视图中… 如何连接控制器的作用域以传递到服务中?谢谢! 问题答案: 如何在angularjs中将范围从控制器传递到服务? 您不能将$ scope注入服务,没有像Singleton $ scope这样的东西。 我想将绑定的ng模型传递给以下服务,该模型位于我的视图中,即ng-model =“ symbol_wanted”

  • 我有一个.NET应用程序,其中有一个用于接收用户请求的控制器,一个服务调用另一个服务。我在中有一些代码,当用户请求值不正确时,我查询数据库(DynamoDB)并得到500错误的响应。我想处理这个问题,这样我就可以捕捉到这个错误/异常,并将错误消息连同一个400状态码一起从控制器发回给用户。我应该如何修改代码来做到这一点? 这是我尝试过的。目前,我只是在中打印错误,但我需要将其发送到控制器。通过抛出

  • 问题内容: 以下是我的html模板: 下面是我的代码: 为什么我会收到“ 未定义 ”而不是“ 某些消息 ” 下面是一个小提琴 http://jsfiddle.net/j2K7N/27/ 问题答案: 您的代码几乎是正确的,但是这里有几个问题: 在这里,您从控制器传递函数,该函数带有一个未定义的参数,该参数会导致警报消息带有“未定义”文本。我建议将HTML代码修改为: 请注意,我将传递为变量而不是函数

  • 问题内容: 我试图创建一个服务来获取json并将其传递给我homeCtrl我可以获取数据,但是当将其传递给我的homeCtrl时,它总是返回undefined。我卡住了。 我的服务: 我的家庭控制器: 问题答案: 您应该从函数返回promise ,当它被解析后,它应该从该函数返回。 厂 同样在控制器内部,您应该调用factory函数,并在service函数解析该调用并将其分配给 码

  • 问题内容: 所以我有一个控制器设置如下: 管理控制器上的“索引”视图仅列出系统中的产品,并允许我们单击产品以查看/编辑/删除该产品。真的很简单。但是,每个产品都有一个CategoryID,该ID告诉我们该产品属于哪个类别,存储在单独的表中。 (非常简化的)当前视图是这样的: 目前这很好,因为在我开发和测试该系统时,系统中只有10或15种产品,但是一旦我部署它,大约就会有。数据库中有300种产品。我

  • 我有一个在事务控制器中分组HTTP请求的测试计划,例如: 现在,我需要控制此类事务的请求速率,而不是单个请求。例如,我可能希望每分钟有60个事务控制器实例 有一个恒定吞吐量计时器,据我所知,它用于控制单个请求的吞吐量。例如,如果我将恒定吞吐量计时器吞吐量设置为每分钟60个,JMeter将在avg上每分钟给我60个请求,但不是每分钟给我60个事务控制器实例。 将JMeter配置为每分钟有60个事务控