【问题标题】:JPA / Hibernate - subclassSubgraphs in NamedEntityGraph ignoredJPA / Hibernate - NamedEntityGraph 中的子类子图被忽略
【发布时间】:2018-07-20 19:09:10
【问题描述】:

我正在使用 JPA 2.1 和 Hibernate 5.3.3。 我有以下实体,其中包含为 GeoObject 定义的 NamedEntityGraph。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@NamedEntityGraph(
    name = "graph.GeoObject",
    attributeNodes = { @NamedAttributeNode(value = "histogram")},
    subclassSubgraphs = {
    @NamedSubgraph(name = "subgraph.A", type = A.class, attributeNodes = { @NamedAttributeNode(value = "pictures") }),
    @NamedSubgraph(name = "subgraph.B", type = B.class, attributeNodes = { @NamedAttributeNode(value = "artifacts") })
    }
)
public abstract class GeoObject extends ObjectBase {

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name="id", updatable = false, insertable = false)
    private Set<HistogramEntry> histogram = new HashSet<>();

    ...
}

@Entity
public class A extends GeoObject {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinTable(joinColumns=@JoinColumn(name="a_id"), inverseJoinColumns=@JoinColumn(name="image_id"))
    private Set<Image> pictures = new HashSet<>();

    ...
}

@Entity
public class B extends GeoObject {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinColumn(name = "b_id", updatable = false)
    private Set<Artifact> artifacts = new HashSet<>();

    ...
}

要获取所有 GeoObjects 的列表,我进行以下查询:

final EntityManager em = getEntityManager();
final CriteriaQuery<GeoObject> query = em.getCriteriaBuilder().createQuery(GeoObject.class);
final Root<GeoObject> entityRoot = query.from(GeoObject.class);
final EntityGraph<?> objGraph = em.getEntityGraph("graph.GeoObject");

final String hint = "javax.persistence.fetchgraph";
final List<GeoObject> result = new ArrayList<>(em.createQuery(query.distinct(true)).setHint(hint, objGraph).getResultList());

GeoObjects 都按预期加载到一个 SQL 查询中(包括直方图属性)。但是对于来自 A 的图片集以及来自 B 的工件集,会为每个对象生成单独的查询。有没有办法构造一个 EntityGraph 来对所有对象进行一次查询?

顺便说一句,当我尝试动态定义 EntityGraph 时,如下所示:

final EntityGraph<GeoObject> objGraph = em.createEntityGraph(GeoObject.class);
objGraph.addAttributeNodes("histogram");
objGraph.addSubclassSubgraph(A.class).addAttributeNodes("pictures");
objGraph.addSubclassSubgraph(B.class).addAttributeNodes("lines");

我在 addSubclassSubgraph 中收到 NotYetImplementedException。

【问题讨论】:

    标签: java hibernate jpa persistence


    【解决方案1】:

    我认为这与一个开放的休眠问题有关,https://hibernate.atlassian.net/browse/HHH-10378

    【讨论】:

      猜你喜欢
      • 2015-06-18
      • 2016-08-31
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多