我确实在项目中的三个模型对象之间有关系(文章末尾的模型和存储库片段)。
当我调用PlaceRepository.findById
它时,会触发三个选择查询:
(“ sql”)
SELECT * FROM place p where id = arg
SELECT * FROM user u where u.id = place.user.id
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
抑制射击时,有两个选择:
SELECT * FROM city c where id = arg
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. 如果逐出所有已加载的对象,则在执行提交和回滚操作时内部会发生什么? 问题答案: 可以将会话视为