java - spring data JPA 忽略查询方法上的 fetchmode

标签 java hibernate jpa spring-data-jpa spring-data

我有具有传递关系的实体。因此,实体 A 通过 OneToMany 映射到实体 B,实体 B 通过 OneToMany 与实体 C 映射。 实体 A 有一个属性 userID,它不是主键,我需要从数据库中获取用户 ID 的所有记录。由于需求,我想急切地获取A和B的子记录。我已经使用 FetchMode join 注释了实体,并且我的存储库有一个方法 findByUserId(int userId)。 我使用 spring data JPA 和 hibernate 作为底层 ORM。 执行上述查询方法会触发多个查询,但我预计只会触发一个带有 join 的查询。

我已经尝试过 EntityGraphs,用 NamedQuery 注释我的存储库方法,尝试映射实体 ManyToOne 双向,但似乎没有任何效果。

@Entity
@Table(name = "A_Master")
public class EntityA{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    private int userId;

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_reservationId")
    @Fetch(FetchMode.JOIN)
    private List<EntityB> bEntities= new ArrayList<>();

}

@Entity
@Table(name = "Entity_B")
public class EntityB{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_journeyId")
    @Fetch(FetchMode.JOIN)
    private List<EntityC> cEntities = new ArrayList<>();
}

public interface ReservationRepository extends JpaRepository<EntityA, Integer>
{
    public List<EntityA> findByUserIdAndStatus(String userId);
}

最佳答案

FetchType 定义集合的加载方式。是立即加载还是延迟加载(按需)。

相反,FetchMode 定义了加载集合的机制。当您用以下标记标记您的 Collection 时:

@OneToMany(cascade = CascadeType.PERSIST)
@Fetch(FetchMode.JOIN)

这是一个废话,因为默认情况下,OneToMany 的 fetchType 是惰性的,但是您不能在惰性集合上使用 JOIN 机制。为了进行 JOIN,您需要将其设置为 EAGER。

hibernate 中的默认 FetchMode 是 SELECT,这是首选的 fetchmode,因为它对于基于键的访问的缓存使用非常有效。我建议您将 FetchType.LazyFetchMode.SELECT 一起使用,并启用集合批处理

关于java - spring data JPA 忽略查询方法上的 fetchmode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54733999/

相关文章:

java - Spring 集成和响应式(Reactive) WebSockets

java - 在 Android 屏幕上显示通知

java - 使用 Hibernate Schema Updater 创建表时出错

java - Hibernate 相当于 EclipseLink 的批量查询提示?

java - ChartJS "Unable to get property ' getTime' 未定义或空引用”

java - 为什么不自动生成 serialVersionUID?

java - Hibernate 为自己创建外键

java - JPA:实现模型层次结构 - @MappedSuperclass 与 @Inheritance

java - 没有关系的 JPA 外键

java - 尝试保留用户时事务中止