当前位置: 首页 > 面试题库 >

FetchMode如何在Spring Data JPA中工作

胡承悦
2023-03-14
问题内容

我确实在项目中的三个模型对象之间有关系(文章末尾的模型和存储库片段)。

当我调用PlaceRepository.findById它时,会触发三个选择查询:

(“ sql”)

  1. SELECT * FROM place p where id = arg
  2. SELECT * FROM user u where u.id = place.user.id
  3. SELECT * FROM city c LEFT OUTER JOIN state s on c.woj_id = s.id where c.id = place.city.id

(对我而言)这是非常不正常的行为。据阅读Hibernate文档后所知,它应该始终使用JOIN查询。在类中FetchType.LAZY更改为
查询时(带有附加SELECT 的查询)没有任何区别,而在类更改为
(使用JOIN查询时)则没有变化。FetchType.EAGER``Place``City``FetchType.LAZY``FetchType.EAGER

当我使用CityRepository.findById抑制射击时,有两个选择:

  1. SELECT * FROM city c where id = arg
  2. SELECT * FROM state s where id = city.state.id

我的目标是在所有情况下都具有sam行为(始终为JOIN或SELECT,但首选JOIN)。

型号定义:

地点:

@Entity
@Table(name = "place")
public class Place extends Identified {

    @Fetch(FetchMode.JOIN)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_user_author")
    private User author;

    @Fetch(FetchMode.JOIN)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "area_city_id")
    private City city;
    //getters and setters
}

市:

@Entity
@Table(name = "area_city")
public class City extends Identified {

    @Fetch(FetchMode.JOIN)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "area_woj_id")
    private State state;
    //getters and setters
}

仓库:

PlaceRepository

public interface PlaceRepository extends JpaRepository<Place, Long>, PlaceRepositoryCustom {
    Place findById(int id);
}

UserRepository:

public interface UserRepository extends JpaRepository<User, Long> {
        List<User> findAll();
    User findById(int id);
}

城市资料库:

public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom {    
    City findById(int id);
}

问题答案:

我认为Spring Data会忽略FetchMode。在使用Spring
Data时,我总是使用@NamedEntityGraph@EntityGraph批注

@Entity
@NamedEntityGraph(name = "GroupInfo.detail",
  attributeNodes = @NamedAttributeNode("members"))
public class GroupInfo {

  // default fetch mode is lazy.
  @ManyToMany
  List<GroupMember> members = new ArrayList<GroupMember>();

  …
}

@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {

  @EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.LOAD)
  GroupInfo getByGroupName(String name);

}

此处 查看文档



 类似资料:
  • 我的项目中的三个模型对象(本文末尾的模型和存储库片段)之间确实存在关系。 当我调用时,它会触发三个select查询: (“sql”) (对我来说)那是相当不寻常的行为。在阅读Hibernate文档后,我认为它应该始终使用连接查询。当类中的更改为时,查询没有区别(使用附加选择进行查询),当更改为时,城市类的查询也一样(使用JOIN进行查询)。 当我使用抑制火灾时,有两种选择: 我的目标是在所有情况下

  • 我正在使用Spring Boot,JPA和Hibernate。我有以下实体,它与有关: 当我读取一个用户时,Hibernate会为每个附加角色生成一个选择,而不是使用加入。在纯Hibernate中,我将通过添加来解决这个问题 但这似乎没有任何影响。 是否可以为有关此实体的所有查询设置首选提取模式? 我找到的一种解决方法,我真的认为这是一种解决方法,因为我需要为每个查询指定它,是这样的:

  • 问题内容: 我需要在hibernate映射上设置获取模式,以在某些情况下急于在其他情况下懒惰。我的默认值(通过hbm文件设置)为lazy =“ true”。如何在代码中覆盖此设置?MyClass具有一个定义为MyClass2类型的集合,我要将FetchMode设置为EAGER。 目前,我有类似的东西: 问题答案: 您可以尝试执行以下操作:(从我头顶上编码) 我相信应该使用FetchMode.JOI

  • 问题内容: 我目前正在从Hibernate切换到纯JPA 2(顺便说一句,这比我最初预期的要耗时得多)。 到目前为止,我遇到的最大问题是找到一种方法来强制加载懒惰的属性。 使用Hibernate可以使用:完成;。 使用JPA 2有什么方法吗? 问题答案: 尝试这个: 假设您的实体与实体之间存在一对一的关系。

  • 我目前正在开发一个具有核心模块和不同“扩展”模块的应用程序。核心模块包括基于Spring配置类的JPA配置以及一些“基本”实体及其存储库,这些实体和存储库将在“扩展”模块中使用。扩展模块包含额外的实体类和JPARepositories。启动扩展模块的JUnit测试时,我遇到以下错误: 为了做到这一点,我尝试了三种不同的方法: 创建了一个名为coreEntityManager和setPackages

  • 问题内容: 我提到了许多文章,但仍然不清楚hibernate状态下的性能。 根据我到目前为止遇到的是,当我们使用批量保存/更新时,如下所示: 用于刷新会话强制Hibernate将Session的内存中状态与数据库同步。 题 1. 刷新会话后,为什么需要这样做?真的需要吗? 2. 会执行提交动作吗? 3. 如果逐出所有已加载的对象,则在执行提交和回滚操作时内部会发生什么? 问题答案: 可以将会话视为