繁体   English   中英

无法延迟初始化角色集合。 简单的 JPA findById

[英]Failed to lazily initialize a collection of role. Simple JPA findById

我也在使用 Spring 和 JPA(Hibernate with MySQL)和 Lombok。

嗨,我的实体有这部分:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "entitya")
public class EntityA  implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ea_id")
    Long id;
    ....

    @ManyToOne
    @JoinColumn(name="g_id", nullable=false)
    private Group group;

    ....
}

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Entity
    @Table(name = "group")
    public class Group implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name="g_id")
        private Long id;

        @OneToMany(mappedBy="group")
        private List<EntityA> enitiesA = new ArrayList<>();

        ...
    }

我还实现了存储库扩展 JPARepository。 进入我的控制器,如果我尝试通过 Id 检索 EntityA,我会获得此异常:

failed to lazily initialize a collection of role: com.mytest.entity.Group.enitiesA, could not initialize proxy - no Session

对我来说这很奇怪,因为我只需要检索对象。 我不使用一些 getter 方法。 因此,理论上,使用默认提取类型,我不需要也有组列表。

怎么了?

您是否正在使用 toString() 调试您的对象?

以防它可能是由@Data 注释引起的错误。

生成的 toString() 方法包含所有字段,因此它可能会调用 enitiesA 变量,从而产生延迟初始化错误。

https://mdeinum.github.io/2019-02-13-Lombok-Data-Ojects-Arent-Entities/

可能是因为您在事务边界之外访问 group.enitiesA。 如果你想这样做,你可以通过将 Eager fetch 类型添加到 OneToMany 映射中来获取它们,例如

@OneToMany(mappedBy="group", fetch = FetchType.EAGER)

这将在加载父对象时加载整个对象图。

如果您仍然想做延迟加载,请考虑将所有调用封装到加载父级的会话下的子级中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM