加载相关实体时忽略实体图

时间:2018-03-26 17:42:26

标签: java hibernate spring-data-jpa persistence eager-loading

我在Person实体中定义了一个实体图。当我将phone属性声明为属性节点时,将创建一个join子句,并且只按预期执行一个select。但是当我从实体图中删除phone属性时,仍然会加载phone字段,但现在为每个Person重新检查了一个新的select查询。是否可以忽略特定EntityGraph中的属性?

人员实体:

@Entity
@Table(name = "person")
@NamedEntityGraph(
    name = Person.PERSON_LAZY,
    attributeNodes = {}
)
public class Person {

    public static final String Person_LAZY = "person.lazy";

    @Id
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @JoinColumn(name = "phone")
    @ManyToOne
    private Phone phone;
}

PersonRepository:

@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {

    @EntityGraph(value = Person.PERSON_LAZY, type = EntityGraphType.FETCH)
    @Query("SELECT p FROM Person p")
    public List<Person> findAllLazy();  
}

1 个答案:

答案 0 :(得分:1)

简短的回答,没有。无法使用实体图表或任何其他方式。

默认情况下,

@ManyToOne关系会被急切加载。你必须使它变得懒惰以防止以任何方式加载它。

一般的建议是,既然你可以急切地加载懒惰的关系,但是你不能懒得加载渴望的关系,那么为了以防万一,你应该倾向于懒惰。

是的,这包括实体图和所有其他可能的技巧。如果一个关系在默认情况下或显式上都是渴望的,那么它永远不会是懒惰的。这显然是一个设计选择/实现细节,即使使用实体图,但没有计划改变它。

相关问题