我有个人课:

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany(fetch = FetchType.LAZY)
    private List<Role> roles;
    // etc
}

与一个懒惰的多对多关系.

在我的控制器里

@Controller
@RequestMapping("/person")
public class PersonController {
    @Autowired
    PersonRepository personRepository;

    @RequestMapping("/get")
    public @ResponseBody Person getPerson() {
        Person person = personRepository.findOne(1L);
        return person;
    }
}

PersonRepository就是这段代码,是根据this guide编写的

public interface PersonRepository extends JpaRepository<Person, Long> {
}

然而,在该控制器I actually need the lazy-data. How can I trigger its loading?

try 访问它将失败,因为

延迟初始化角色集合失败: no.dusken.morus.model.Person.Roles,无法初始化代理-否 会话

或者其他的例外取决于我的try .

我的xml-description美元,以备不时之需.

谢谢

推荐答案

您必须对惰性集合进行显式调用才能对其进行初始化(为此,通常的做法是调用.size()).在Hibernate中,有专门的方法来实现这一点(Hibernate.initialize()),但是JPA没有对应的方法.当然,当会话仍然可用时,您必须确保调用已经完成,所以用@Transactional注释您的控制器方法.另一种方法是在控制器和存储库之间创建中间服务层,该中间服务层可以公开初始化惰性集合的方法.

更新:

请注意,上述解决方案很简单,但会导致对数据库的两个不同查询(一个用于用户,另一个用于其角色).如果您想获得更好的性能,请向Spring Data JPA存储库界面添加以下方法:

public interface PersonRepository extends JpaRepository<Person, Long> {

    @Query("SELECT p FROM Person p JOIN FETCH p.roles WHERE p.id = (:id)")
    public Person findByIdAndFetchRolesEagerly(@Param("id") Long id);

}

此方法将使用JPQL的fetch join子句在数据库的单个往返行程中Eager 地加载角色关联,因此将减轻上述解决方案中两个不同查询带来的性能损失.

Java相关问答推荐

Selenium Java:无法访问IFRAME内部的元素

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

空手道比赛条件

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

Java中是否有某种类型的池可以避免重复最近的算术运算?

无法在WebSocket onMessage中捕获错误

为什么Java编译器不区分不同类型的方法?

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

如何将其他属性引用到log4j2 yaml配置中?

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

Java在操作多个属性和锁定锁对象时使用同步和易失性

向Java进程发送`kill-11`会引发NullPointerException吗?

在Java中将.GRF转换为图像文件

JPA无手术同品种器械可能吗?

为什么我的登录终结点不能被任何请求访问?

如何使JOOQ渐变脚本不重新创建表未更改的类?

原始和参数化之间的差异调用orElseGet时可选(供应商)