【问题标题】:Fetch the children of a lazy one to many list获取一个懒惰的一对多列表的孩子
【发布时间】:2017-02-27 11:30:17
【问题描述】:

上下文:使用 play framework (1.3)、hibernate (4.3.8) 和 html 端的一些 Groovy 开发内部 Web 应用程序。

我目前正在使用 Hibernate,我被分配寻找一些优化技术。我们遇到了一些加载问题,因为所有内容都是延迟获取的,当我们尝试使用 Groovy 访问它时,Hibernate 会发出大量请求,这会花费大量时间,从而使我们的应用程序非常缓慢。

所以我正在尝试调整我们的 find 方法以获取我需要的所有内容,这样 Hibernate 就不必这样做了。

这是我的课:

@实体 @Table(name="business_partner", schema = "public") 公共类 BusinessPartner 扩展模型{ @ID @Column(name="business_partner_id", 可更新=false, nullable=false) @GeneratedValue(strategy=GenerationType.TABLE, generator="businessPartnerGenerator") @TableGenerator(name="businessPartnerGenerator", 表="key_generator", pkColumnName="table_name", valueColumnName="next_id", 分配大小=1) 私有整数业务合作伙伴ID; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "airline_id") @独特 私人航空公司; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "trader_country_id") 私人国家贸易商国家; @Column(name = "name", nullable = false) @必需的 @MaxSize(50) @独特 私有字符串名称; @Column(名称=“代码”,可更新=假) @MaxSize(5) @独特 私有字符串代码; @Column(name = "is_active", nullable = false) 私有布尔isActive; @OneToMany(fetch = FetchType.LAZY, mappedBy="businessPartner", cascade=CascadeType.ALL) @Fetch(FetchMode.SUBSELECT) 私有列表 lstBusinessPartnerTypes = new ArrayList(); @OneToMany(fetch = FetchType.LAZY, mappedBy="businessPartner", cascade=CascadeType.ALL) @Fetch(FetchMode.SUBSELECT) 私有列表 lstBusinessPartnerAddresses = new ArrayList();

这是我的标准:

公共静态列表 findAll(){ 会话 oSession = SessionManager.createSession(); 列出 lstBusinessPartners = (List)oSession.createCriteria(BusinessPartner.class) .createAlias("lstBusinessPartnerAddresses", "lstBPA") .createAlias("lstBusinessPartnerTypes", "lstBPT") .setFetchMode("航空公司", FetchMode.JOIN) .setFetchMode("lstBPA.country", FetchMode.SELECT) .setFetchMode("lstBPT.typeBusinessPartner", FetchMode.SELECT) .addOrder(Order.asc("code")) 。列表(); SessionManager.closeSession(oSession); 返回 lstBusinessPartners; }

所以我需要访问航空公司和每个一对多列表的孩子。

我可以访问航空公司,那里没有问题。当我尝试访问列表中的对象时,它变得很棘手。我无法加载列表或他们的孩子(从我的标准中可以看出,我试图在一个列表中访问国家/地区并在另一个列表中键入业务合作伙伴)。我对每个业务合作伙伴都提出了这样的要求:

Hibernate example

所以我的问题是:是否可以使用标准获取惰性列表?如果是的话怎么办?

【问题讨论】:

    标签: hibernate groovy alias fetch hibernate-criteria


    【解决方案1】:

    所以如果有人偶然发现这篇文章寻找答案,我找到了我的答案。您需要为您的列表创建一个别名并指定 JoinType 如下:

    BusinessPartner oBusinessPartner = (BusinessPartner)oSession.createCriteria(BusinessPartner.class, "BP")
                .add(Restrictions.eq("businessPartnerId", iBusinessPartnerId))
                .createAlias("lstBusinessPartnerTypes", "lstBPT", JoinType.LEFT_OUTER_JOIN)
                .createAlias("lstBPT.typeBusinessPartner", "TBP", JoinType.LEFT_OUTER_JOIN)
                .createAlias("lstBPT.accountGroup", "AG", JoinType.LEFT_OUTER_JOIN)
                .createAlias("AG.typeBusinessPartner", "AGTBP", JoinType.LEFT_OUTER_JOIN)
                .createAlias("lstBusinessPartnerAddresses", "lstBPA", JoinType.LEFT_OUTER_JOIN)
                .createAlias("lstBPA.country", "BPAC", JoinType.LEFT_OUTER_JOIN)
                .createAlias("lstBPA.language", "BPAL", JoinType.LEFT_OUTER_JOIN)       
    
                .uniqueResult();
    

    【讨论】:

      【解决方案2】:

      您可以使用 Hibernate.initialize(Object) 方法初始化每个集合。因此,在您的 DAO 层中,只需检索“父亲”对象,然后为每个孩子调用此方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-31
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        相关资源
        最近更新 更多