我尝试使用 EntityGraph 来避免使用 fetch=FetchType.EAGER:
EntityGraph<?> graph = entityManager.getEntityGraph("parent.hierarchy");
Map<String, Object> hints = new HashMap<>();
hints.put("jakarta.persistence.fetchgraph", graph);
return entityManager.find(ParentEntity.class, id, hints); // return everything
我希望查找结果返回所有关系,我的实体结构看起来像这样(简化):
@Entity
@Table(name = "PARENT_TABLE")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "PARENT_TYPE_ID", discriminatorType = DiscriminatorType.INTEGER)
@NamedEntityGraph(name="parent.hierarchy",
attributeNodes = {
@NamedAttributeNode(value="children", subgraph="parent.child.hierarchy"),
},
subgraphs = {
@NamedSubgraph(
name = "parent.child.hierarchy",
attributeNodes = {
@NamedAttributeNode(value="grandchildren", subgraph = "parent.grandchildren.hierarchy"),
@NamedAttributeNode("childSubscribers")
}
)
}
)
public abstract class ParentEntity implements Serializable {
private Long parentTypeId;
private List<ChildEntity> children;
@Column(name = "PARENT_TYPE_ID", insertable=false, updatable=false)
public Long getParentTypeId() {
return parentTypeId;
}
public void setParentTypeId(Long parentTypeId) {
this.parentTypeId = parentTypeId;
}
@OneToMany(targetEntity = ChildEntity.class, orphanRemoval=true, cascade=CascadeType.ALL)
@JoinColumn(name="POLICIES_ID")
public List<ChildEntity> getChilds() {
return children;
}
public void setChilds(List<ChildEntity> children) {
this.children = children;
}
...
}
@Entity
@Table(name="CONCREATE_PARENT_TABLE_A")
@DiscriminatorValue(100L)
public class ConcreateParentAEntity extends ParentEntity {
...
}
@Entity
@Table(name="CONCREATE_PARENT_TABLE_B")
@DiscriminatorValue(101L)
public class ConcreateParentBEntity extends ParentEntity {
...
}
@Entity
@Table(name="CHILD_TABLE")
@DiscriminatorColumn(name="CHILD_SUBTYPE", discriminatorType=DiscriminatorType.CHAR)
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue("B") // default // #hibernate
public class ChildEntity implements Serializable {
private Character subtype;
private List<GrandchildEntity> grandchildren;
@Column(name="CHILD_SUBTYPE", insertable=false, updatable=false)
public Character getSubtype() {
return subtype;
}
public void setSubtype(Character subtype) {
this.subtype = subtype;
}
@OneToMany(targetEntity=GrandchildEntity.class, cascade=CascadeType.ALL,orphanRemoval=true)
@JoinColumn(name="CHILD_ID")
public List<GrandchildEntity> getGrandchildren() {
return grandchildren;
}
public void setGrandchildren(List<GrandchildEntity> grandchildren) {
this.grandchildren = grandchildren;
}
...
}
@Entity
@Table(name="CONCRETE_CHILD_A")
@DiscriminatorValue("A")
@PrimaryKeyJoinColumn(name="CHILD_ID")
public class ConcreteChildAEntity extends ChildEntity {
...
}
@Entity
@Table(name="CONCRETE_CHILD_B")
@DiscriminatorValue("B")
@PrimaryKeyJoinColumn(name="CHILD_ID")
public class ConcreteChildBEntity extends ChildEntity {
...
}
但是实体图的entity.find()似乎并没有获取关系、子孙!可能出了什么问题?我该如何调试或纠正该问题? 应用程序正在 Wildfly 30.0.0-Final 下运行
谢谢!
测试:
String jpql = "SELECT p FROM ParentEntity p WHERE p.id = :id";
ParentEntity parent = entityManager.createQuery(jpql, ParentEntity.class)
.setParameter("id", id)
.setHint("jakarta.persistence.fetchgraph", graph)
.getSingleResult();
查看错误或返回什么,然后从那里分而治之。