当前位置: 首页 > 面试题库 >

JPA:如何为3个级别定义@NamedEntityGraph?

章光华
2023-03-14
问题内容

我有3个实体。分支,主题,主题。分支具有主题列表,而主题具有主题列表。而且subjectList和topicList都是惰性的。我想在单个查询中获取所有分支,包括其主题和主题。

1。

@Entity
public class Branch implements Serializable 
{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;

    @OneToMany(mappedBy = "branch")
    private List<Subject> subjectList;
    //Getters and Setters
}

2。

@Entity
public class Subject implements Serializable 
{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String name;

    @ManyToOne()
    private Branch branch;

    @OneToMany(mappedBy = "subject")
    private List<Topic> topicList;
    //Getters and Setters       
}

3。

@Entity
public class Topic implements Serializable 
{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;

    @ManyToOne()
    private Subject subject;
    //Getters and Setters
}

我尝试了下面的方法,但是没有用。

@NamedEntityGraph(name="branch_subject", 
attributeNodes = {
    @NamedAttributeNode(value="name"),
    @NamedAttributeNode(value="subjectList", subgraph = "subjectListGraph")
},
subgraphs = {
    @NamedSubgraph(name="subjectListGraph",
            attributeNodes = {
                @NamedAttributeNode(value="name"),
                @NamedAttributeNode(value = "topicList", subgraph = "topicListGraph")
            }
    ),
    @NamedSubgraph(name="topicListGraph",
            attributeNodes = {
                    @NamedAttributeNode("name")
            }
    )
}
)

另外下面的代码用于从数据库中获取数据,我使用JPQL如下

    EntityGraph branchEntityGraph = entityManager
                .getEntityGraph("branch_subject");

        Branch branch = entityManager
                .createQuery("SELECT b from Branch b WHERE b.id=:ID",
                        Branch.class)
                .setHint("javax.persistence.loadgraph", branchEntityGraph)
                .setParameter("ID", branch1.getId()).getResultList().get(0);

这给下面的例外

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

问题答案:

Hibernate不允许您获取多个Bags,因为它最终将获取笛卡尔积。

  1. 您要么创建集合集,要么创建列表,然后面对笛卡尔积性能问题。

  2. 如果您已经具有INNERJOIN关系,则可以简单地从最内层的Child直到根目录进行获取,然后重新组装结构。由于查询如下所示,因此效率更高:

        select t 
    from Topic t
    join t.subject s
    join s.branch b

EntityGraphBuilder,我在我的文章中描述很容易适应你的使用情况。



 类似资料:
  • 现在,它调用的一个java文件需要花费大量时间来完成。我没有这个类的访问权限,所以我想为那个特定的类设置一个特定的日志记录级别,以试图了解我的实现有什么问题。 我不想改变全局日志记录级别,我只想为某个类添加一个特定的级别,如何实现?

  • 我只是想知道是否有这样一种方法,我可以将我的MySQL表构建为 但是,只有当hibernate++jpa开始构建具有“”的表时,我才在我的DDL中得到这一点 在我的类中,我有这些注释设置,

  • 我正在为Android使用登录。我有两个追加器,一个写文件,另一个用于logcat。 我如何给每个附加器不同的级别?我希望logcat是跟踪和文件是信息。

  • 目前,我正在创建一个有自己自定义分类法的CPT。它可以选择父和子。但是当我创建一个新闻帖子时,按照层次顺序的分类法只选择最后一个孩子。 我试图使层次结构为假,改变'with_front'= 我目前取得的成果是 *http://localhost/CPTUI/custom-taxonomy/postname。 但我想要达到的实际结果是 *http://localhost/CPTUI/parent/p

  • 问题内容: 如何定义OSGi捆绑包的开始级别? 我正在使用Apache felix,并希望在框架执行过程中保持起始级别。我预计Manifest中的条目根本不需要非常频繁地更改bundle的开始级别。MF似乎是最明智的。我已经到org.osgi.framework.startlevel了,但是还没有看到实际的例子。 如果有一种巧妙的方法将起始级别并入POM,那么我也将maven与maven-bund