我正在构建一个SpringDataJPA应用程序,并使用SpringSecurity保护我的API调用。
Principal是通过我的自定义实现UserDetailsService.loadByUsername
(...)加载的,只检索User
实体本身,因为默认情况下它的所有关联都是LAZY。
这是通过Spring Filter在每个控制器被命中之前完成的(我正在进行JWT Auth)
然而,对于某些请求(比如POST /todo
),我还需要加载用户的一些惰性关联(用户的Todos),以便向它们添加新数据并将其持久化。
我的目标是在通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()
获取主体时已经加载了一些关联(取决于上下文),而不必将它们设置为EAGER。
当我需要关联时,可以重写UserDetailsService.loadByUsername
以JOIN FETCH请求关联。
谢谢
2条答案
按热度按时间kt06eoxx1#
让这些关联在代码中被请求时被延迟加载会有什么问题呢?你可以总是先从实体管理器中分离实体,然后根据上下文用你需要的提取连接重新加载它。类似于:
puruo6ea2#
你根本不需要加载
@ManyToOne
(像Todos一样)的关联部分,只需要创建新的TodoEntity
,给它分配一个用户并保存。如果您需要修改任何内容,最好将用户的所有关联与用户分开处理。