2016-10-18 3 views
1

Контекст: Разработка собственных веб-приложений с использованием игрового фреймворка (1.3), спящего режима (4.3.8) и некоторых Groovy со стороны html.Извлеките детей от ленивых ко многим спискам

В настоящее время я работаю с 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; 
    } 

Так мне нужно открыть авиакомпанию и ребенка каждого из многих списков.

Я могу получить доступ к авиакомпании, там нет проблем. Это когда я пытаюсь получить доступ к объекту в списке, который становится сложным. Я не могу загрузить списки и их дочерние элементы (как вы можете видеть из моих критериев, я пытаюсь получить доступ к стране в одном списке и набирать бизнес-партнера в другом). Я получаю этот вид запроса для каждого делового партнера:

Hibernate example

Так что мой вопрос заключается в следующем: можно ли принести ленивый список, используя критерии? И если да, то как?

ответ

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

Вы можете инициализировать каждую коллекцию с методом Hibernate.initialize (Object). Таким образом, на вашем уровне DAO необходимо только восстановить объект «отец», а затем вызвать этот метод для каждого дочернего элемента.

Смежные вопросы