@NamedEntityMap 似乎在 Wildfly 30.0.x 中不起作用

问题描述 投票:0回答:1

我尝试使用 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 下运行

谢谢!

hibernate jpa wildfly hibernate-mapping
1个回答
0
投票

测试:

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();

查看错误或返回什么,然后从那里分而治之。

© www.soinside.com 2019 - 2024. All rights reserved.