加载相关实体时忽略实体图
Entity Graph ignored when loading related entities
我在我的 Person 实体中定义了一个实体图。当我将 phone 属性声明为属性节点时,会创建一个连接子句,并且只执行一个 select,正如预期的那样。但是当我从实体图中删除 phone 属性时,phone 字段仍然被加载,但现在对每个检索到的人都有一个新的 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;
}
个人资料库:
@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();
}
简答,没有。实体图或任何其他方式都不可能。
@ManyToOne
关系默认是急切加载的。你必须让它变得懒惰以防止它以任何方式加载。
一般的建议是,既然你可以 eagerly load lazy relations,但是你不能 load eager relations lazy,所以你应该支持 lazy 以防万一。
是的,这包括实体图和所有其他可能的技巧。如果一个关系默认或明确地是渴望的,它永远不会是惰性的。这显然是一个设计 choice/implementation 细节,即使有实体图,但没有改变它的计划。
我在我的 Person 实体中定义了一个实体图。当我将 phone 属性声明为属性节点时,会创建一个连接子句,并且只执行一个 select,正如预期的那样。但是当我从实体图中删除 phone 属性时,phone 字段仍然被加载,但现在对每个检索到的人都有一个新的 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;
}
个人资料库:
@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();
}
简答,没有。实体图或任何其他方式都不可能。
@ManyToOne
关系默认是急切加载的。你必须让它变得懒惰以防止它以任何方式加载。
一般的建议是,既然你可以 eagerly load lazy relations,但是你不能 load eager relations lazy,所以你应该支持 lazy 以防万一。
是的,这包括实体图和所有其他可能的技巧。如果一个关系默认或明确地是渴望的,它永远不会是惰性的。这显然是一个设计 choice/implementation 细节,即使有实体图,但没有改变它的计划。