当前位置: 首页 > 知识库问答 >
问题:

把一个懒惰的孩子拿到许多名单上

华展鹏
2023-03-14

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

我目前正在使用Hibernate,我被指派去寻找一些优化技术。我们有一些加载问题,因为所有的东西都是懒洋洋地取来的,当我们试图用Groovy访问它时,Hibernate会像雨点一样大量地输入请求,这会耗费大量的时间,使我们的应用程序变得非常慢。

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

这是我的课:


    @Entity
    @Table(name="business_partner", schema = "public")
    public class BusinessPartner extends Model{
        @Id
        @Column(name="business_partner_id", updatable=false, nullable=false)
        @GeneratedValue(strategy=GenerationType.TABLE, generator="businessPartnerGenerator")
        @TableGenerator(name="businessPartnerGenerator",
                table="key_generator",
                pkColumnName="table_name",
                valueColumnName="next_id",
                allocationSize=1)
        private Integer businessPartnerId;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "airline_id")
        @Unique
        private Airline airline;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "trader_country_id")
        private Country traderCountry;

        @Column(name = "name", nullable = false)
        @Required
        @MaxSize(50)
        @Unique
        private String name;

        @Column(name = "code", updatable = false)
        @MaxSize(5)
        @Unique
        private String code;

        @Column(name = "is_active", nullable = false)
        private Boolean isActive;

        @OneToMany(fetch = FetchType.LAZY, mappedBy="businessPartner", cascade=CascadeType.ALL)
        @Fetch(FetchMode.SUBSELECT)
        private List lstBusinessPartnerTypes = new ArrayList();

        @OneToMany(fetch = FetchType.LAZY, mappedBy="businessPartner", cascade=CascadeType.ALL)
        @Fetch(FetchMode.SUBSELECT)
        private List lstBusinessPartnerAddresses = new ArrayList();

以下是我的标准:


public static List findAll(){
        Session oSession = SessionManager.createSession();

        List lstBusinessPartners = (List)oSession.createCriteria(BusinessPartner.class)
                .createAlias("lstBusinessPartnerAddresses", "lstBPA")
                .createAlias("lstBusinessPartnerTypes", "lstBPT")
                .setFetchMode("airline", FetchMode.JOIN)
                .setFetchMode("lstBPA.country", FetchMode.SELECT)
                .setFetchMode("lstBPT.typeBusinessPartner", FetchMode.SELECT)
                .addOrder(Order.asc("code"))
                .list();

        SessionManager.closeSession(oSession);

        return lstBusinessPartners;
    }

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

我可以访问航空公司,那里没有问题。当我尝试访问列表中的对象时,它变得很棘手。我不能加载列表或它们的子列表(正如您可以从我的标准中看到的,我试图在一个列表中访问country,并在另一个列表中键入business partner)。我对每一个商业伙伴都有这样的要求:

Hibernate示例

所以我的问题是这样的:是否可以使用标准来获取一个惰性列表?如果是的话,该怎么做呢?

共有2个答案

陶英达
2023-03-14

您可以使用Hibernate.initialize(Object)方法初始化每个集合。所以在DAO层中,只需要检索‘父’对象,然后为每个子对象调用此方法。

彭正谊
2023-03-14

所以我找到了我的答案,如果有人在这个帖子上绊倒寻找答案。您需要为列表创建一个别名,并指定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();
 类似资料:
  • 这样不仅可以将转移页面的子元素放入数组,还可以将子元素的子元素放入数组。

  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语

  • 实现一对多关系并选择父项和子项我有一个关系,我想进行查询(选择*) 文件夹。JAVA 作者。JAVA 我的请求: 我得到了这样的结果: 我的代码有什么问题?什么是问题,当我执行查询我得到了这个结果...我想得到这个结果

  • 本文向大家介绍groovy 懒惰的表达,包括了groovy 懒惰的表达的使用技巧和注意事项,需要的朋友参考一下 示例 我们可以在字符串中进行惰性插值。这与普通插值不同,因为每当将GString转换为String时,它可能具有不同的值(取决于闭包)。            

  • 描述 (Description) Lazy DynaBeans是DynaBean的一个实现,它提供了Lazy List和Lazy Map的特性,它连接了DynaClass的属性。 有两种类型的Lazy DynaBeans: LazyDynaBean :它指定惰性DynaBean,它提供名称和数据类型的动态修改属性。 LazyDynaMap :它通过使用惰性映射或列表系统,使DynaBean的轻量级

  • 问题内容: 如果按以下方式实现单例, 此实现与延迟初始化方法有何不同?在这种情况下,实例将在加载类时创建,并且仅在第一次使用时才加载类本身(例如,Singleton.getInstance(),而当您声明实例Singleton singleton = null;时则不会)。 即使采用惰性初始化方法,该实例也是在对getInstance()的调用上创建的 我在这里想念什么吗? 问题答案: 您也可以调