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

Spring boot JPA惰性加载不适用于一对一映射

叶茂
2023-03-14

请注意,我已经看过类似的问题,我已经解释了为什么它们对我不起作用

我有一个简单Spring boot JPA-Hibernate应用程序,它具有用户和地址之间的一对一映射。(请注意,我对一对多映射没有这个问题)

用户实体

@Entity
    @Table(name = "users")
    public class User implements Serializable {

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

        @Column
        private String name;

        @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
        private Address address;

        @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
        private Set<Note> notes;

    }
   @Entity
    @Table(name = "addresses")
    public class Address implements Serializable {

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

        @Column
        private String street;

        @Column
        private String city;

        @JsonIgnore
        @OneToOne
        @JoinColumn(name = "user_id")
        private User user;

    }
@Entity
    @Table(name = "notes")
    public class Note implements Serializable {

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

        @Column
        private String date;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "user_id", nullable = false)
        private User user;

    }

员额1

我还读到spring.jpa.open-in-view defualt值可能是罪魁祸首:

员额2

通过将spring.jpa.open-in-view=false添加到我的application.properties中,我禁用了默认的“在视图中打开”属性

Could not write JSON: failed to lazily initialize a collection of role error

我假设这是因为Jackson正在调用我的lazily loaded对象的getters,所以我按照另一个帖子中的说明添加了以下内容,让Jackson不去处理lazily loaded集合

pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.9.9</version>
</dependency>

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate5Module());
            }
        }
    }

}

我不确定我能在这里做什么。默认登陆页面上的用户实体不需要任何地址细节,所以我不想在登陆页面上加载它。当记录被点击后,它就会导航到另一个页面,我希望所有的延迟加载对象都在响应中返回。

我已经尝试了一切我可以找到的网上但仍然没有任何工作到目前为止。我真的很感谢你帮我做这件事。

正如一位用户提到的,它可能重复了SO:建议的可能重复的另一个问题,我想提到的是,我通过禁用spring.jpa.open-in-view属性,但添加了

mapper.registerModule(new Hibernate5Module());

共有1个答案

胥玮
2023-03-14

它的工作方式与JPA规范相同:-

请参阅以下URL https://javaee.github.io/javaee-spec/javadocs/javax/persistence/fetchtype.html

懒惰提取策略只是一个提示(正如javadoc所说的数据可以懒惰地提取)。不是强制性的行动。

 类似资料:
  • 我知道懒加载是做不到的,如果你在一对一的关系中有双向的关系。 所以我读了一篇关于如何使JPA OneToOne关系变懒的文章。 文章说你不能在一对一的关系中创建代理,但我不太理解。 我觉得多对一的关系和一对一的关系没有什么区别。他说,在多对一的关系中,您可以创建一个代理,因为您可以从fk获得值。 我觉得这两个是不一样的。我知道PK值相等,那么为什么不只有一对一的关系做懒加载呢?

  • 问题内容: 我的多对一映射存在性能问题。当我在日志文件中调试SQL查询时,可以进行主体查询,但是在我有其他表示多对一对象映射的查询之后。 Entity.hbm.xml: Object1.hbm.xml: Object2.hbm.xml: 查询HBM: 在pom.xml中 问题答案: 您是否尝试过像这样的FetchMode.SELECT?

  • 默认情况下,Hibernate支持一对多/多对一和多对多关联的惰性加载。但Hibernate不支持一对一关系的延迟加载。让我们为父场景和子场景提供以下示例。 一个人有一个地址父实体定义为。 子实体定义为 在上面的场景中,它应该是惰性加载,但实际上hibernate正在产生急切的加载。两个select语句同时激发1)select用于父实体,在本例中为Person;2)select用于子实体,在本例中

  • 问题内容: 很抱歉打扰-也许这是一个非常简单的问题- 但由于某些原因,下面的版本无法解析,而带有set的版本可以正常工作。实际上,如果我仅使用set版本并将set替换为list,则会得到: 嵌套异常为org.hibernate.InvalidMappingException:无法从无效映射中解析映射文档 谢谢米莎 问题答案: 你说 而带有set的版本可以正常工作 这是清单DOCTYPE 您可以看到

  • 我有一个具有一对多关联的hibernate实体: *为清晰起见,删除了一些注释 子实体映射到具有复合主键(key和PARENT_ID)的表。问题是,当两个用户将相同的子项(使用相同的密钥)添加到相同的父项时,级联保存(session.saveOrUpdate(Parent))失败,子项的主键冲突而不是乐观锁失败。 如果除了集合之外,用户还更改了父实体中的其他一些属性,乐观锁也能正常工作。 我可以在

  • 我正在使用JPA2.1(Eclipselink2.5.1)和JBoss7.1。 为什么不工作是懒惰加载? 谢谢