【问题标题】:Check wheter there is a relation between two entites hibernate检查两个实体之间是否存在关系hibernate
【发布时间】:2021-05-06 09:39:17
【问题描述】:

我在我的项目中使用 Hibernate 作为 ORM,其中我有两个处于多对一关系的实体。

@Entity
public class Book {
...
@Id
private int id;

@OneToMany(mappedBy="book")
private List<Page> pages
...
}

@Entity
public class Page {
...
@Id
private int id;

@ManyToOne
@JoinColumn(name="BOOK_ID")
private Book book;
...
}

我必须创建一个函数来获取对 (bookId,pageId) 并检查这两个 id 之间是否存在关系。我很好奇哪种方式更“轻量级”(如果提出的两种方法之间存在差异)以及为什么。

public boolean check(int bookId, int pageId){
    final Book book = entityManager.find(bookId,Book.class);
    final Page page = entityManager.find(pageId, Page.class);
    return page.getBook().getId().equals(book.getId());
}

public boolean check(int bookId, int pageId){
    final Page page = entityManager.find(pageId, Page.class);
    return page.getBook().getId().equals(bookId);
}

请注意,这些清单是简化的,并不反映整个代码(及其背后的想法)。

【问题讨论】:

    标签: hibernate orm relational-database one-to-many


    【解决方案1】:

    最后一种方法更“轻量级”,因为它只需要一次直接获取:

    entityManager.find(pageId, Page.class);
    

    请参阅this section 的休眠文档,如那里所建议的那样:

    Hibernate 建议将所有关联静态标记为惰性,并使用动态获取策略来实现渴望。

    不幸的是,这与 JPA 规范不一致,该规范定义了所有一对一和多对一关联都应在默认情况下急切获取。

    Hibernate,作为 JPA 提供者,遵循该默认设置。

    所以,我建议您更正您的 @ManyToOne 关联:

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="BOOK_ID")
    private Book book;
    

    至于上述情况你其实不需要fetch = FetchType.EAGER

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多