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

延迟加载(使用FK的一对一)问题

孙昂然
2023-03-14

当执行session . create query(" from Author ")时。list();即使关系被标记为optional=false,fetch type = lazy from Author-

Hibernate:选择author0_。作者ID为作者I1 0,作者0。电子邮件为email2_0_,author0_。名为name3_0_ from AUTHOR author0_

Hibernate:选择“book0_”。BOOK_ID为BOOK_ID1_1_0_,book0_。AUTHOR_ID为AUTHOR_I5_1_0_,book0_描述为descript2_1_0_,book0_。作为PUBLISHE3_1_0_出版,book0_.title作为title4_1_0_来自BOOK book0_,book0_。AUTHOR_ID=?

Hibernate:选择“book0_”。BOOK_ID为BOOK_ID1_1_0_,book0_。AUTHOR_ID为AUTHOR_I5_1_0_,book0_描述为descript2_1_0_,book0_。作为PUBLISHE3_1_0_出版,book0_.title作为title4_1_0_来自BOOK book0_,book0_。AUTHOR_ID=?

Hibernate:选择“book0_”。BOOK_ID为BOOK_ID1_1_0_,book0_。AUTHOR_ID为AUTHOR_I5_1_0_,book0_描述为descript2_1_0_,book0_。作为PUBLISHE3_1_0_出版,book0_.title作为title4_1_0_来自BOOK book0_,book0_。AUTHOR_ID=?

Hibernate:选择“book0_”。BOOK_ID为BOOK_ID1_1_0_,book0_。AUTHOR_ID为AUTHOR_I5_1_0_,book0_描述为descript2_1_0_,book0_。作为PUBLISHE3_1_0_出版,book0_.title作为title4_1_0_来自BOOK book0_,book0_。AUTHOR_ID=?

Hibernate:选择“book0_”。BOOK_ID为BOOK_ID1_1_0_,book0_。AUTHOR_ID为AUTHOR_I5_1_0_,book0_描述为descript2_1_0_,book0_。作为PUBLISHE3_1_0_出版,book0_.title作为title4_1_0_来自BOOK book0_,book0_。AUTHOR_ID=?

Hibernate:选择“book0_”。BOOK_ID为BOOK_ID1_1_0_,book0_。AUTHOR_ID为AUTHOR_I5_1_0_,book0_描述为descript2_1_0_,book0_。作为PUBLISHE3_1_0_出版,book0_.title作为title4_1_0_来自BOOK book0_,book0_。AUTHOR_ID=?

@Entity
@BatchSize(size=3)
@Table(name = "AUTHOR")
public class Author {
    private long id;
    private String name;
    private String email;
    private Book book;


    public Author() {
    }

    public Author(String name, String email) {
        this.name = name;
        this.email = email;
    }

    @Id
    @Column(name = "AUTHOR_ID")
    @GeneratedValue
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY,optional=false,mappedBy="author")
    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }


@Entity
@BatchSize(size=3)
@Table(name = "BOOK")
public class Book {

     private long id;
        private String title;
        private String description;
        private Date publishedDate;

        private Author author;

        public Book() {
        }

        @Id
        @Column(name = "BOOK_ID")
        @GeneratedValue
        public long getId() {
            return id;
        }

        public void setId(long id) {
            this.id = id;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        @Temporal(TemporalType.DATE)
        @Column(name = "PUBLISHED")
        public Date getPublishedDate() {
            return publishedDate;
        }

        public void setPublishedDate(Date publishedDate) {
            this.publishedDate = publishedDate;
        }

        @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY,optional=false)
        @JoinColumn(name ="AUTHOR_ID",unique=true)
        public Author getAuthor() {
            return author;
        }

        public void setAuthor(Author author) {
            this.author = author;
        }
    }

共有1个答案

江洲
2023-03-14

您忽略了从< code>Author到< code>Book的链接不是双向关联的定义所有者,我的意思是它被定义为mappedBy,而FK驻留在< code>Book表中。因此,当检索到一个作者时,它需要查询Book表来检查FK,并找出是否有一本书以及每个作者关联了哪本书。这就是为什么您在book表上看到的select语句与您拥有的作者一样多(这就是所谓的N 1查询问题)。

避免这种情况的一种方法是切换关联的所有者侧(在Author表中定义一个FK到Book),但您将看到类似的图书查询行为。

如果您关心的是并行查询,那么一个选项是在查询中应用获取策略,强制检索与作者关联的书籍。查询将类似于,会话。createQuery(“从作者a左连接获取a.book”).list()

我告诉过您原因和基本解决方案/解决方法,但也有更复杂的选项,您肯定可以在stackoverflow中找到它们。

 类似资料:
  • 我面临的问题是一对一的惰性加载在Hibernate中不起作用。我已经解决了,但还是不明白会发生什么。 我的代码(懒惰加载在这里不起作用,当我拉person-address也被提取): 但是:如果我在OneToOne关系中添加,那么惰性加载工作很好! 问题/恳求:请给我解释一下注释如何帮助实现延迟加载。 附注。我看过post1和post2,明白了为什么简单的OneToOne不能偷懒,但我还是不能掌握

  • 问题内容: 我遇到了 一个 问题,即 一对一的延迟加载 在hibernate状态下不起作用。我 已经解决了它 ,但仍然 无法 正确 理解 会发生什么。 我的代码( 延迟加载在这里不起作用 ,当我拉人时-地址也被获取): 但是 :如果我添加 OneToOne关系,则延迟加载 效果很好 ! 问题/完整性: 请向我解释注释如何帮助实现延迟加载。 PS 我已经阅读了post1和post2的帖子,并了解了为

  • 问题内容: 如果实体A具有与实体B的双向一对一或零对一映射。 映射如下: 和 当我对EntityA进行hql查询(或更确切地说,是命名的hql查询)时,hibernate会急切地用单独的select语句加载EntityA#propertyB。 我的问题是,如果我的hql返回1000个EntityA(所有人都有各自的EntityB),hibernate将执行n + 1个查询(第一个查询是针对Enti

  • 本文向大家介绍Mybatis一对一延迟加载实现过程解析,包括了Mybatis一对一延迟加载实现过程解析的使用技巧和注意事项,需要的朋友参考一下 需求:用户和账户一对一关系,查询账户时实现用户的延迟加载 思路:根据id查询,需要延迟加载的一方 1、用户实体类 2、账户实体类 3、用户持久层接口 4、账户持久层接口 5、全局配置文件 6、用户映射配置文件 7、账户映射配置文件 以上就是本文的全部内容,

  • 我有一个类,其中包含一个延迟加载的属性

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l