2016-10-18 2 views
1

Kontext: Entwicklung von In-House-Web-Anwendungen mit Play-Framework (1.3), Hibernate (4.3.8) und einige Groovy auf der HTML-Seite.Fetch ein Kinder von einem faulen eins zu viele Liste

Ich arbeite derzeit mit Hibernate und ich wurde beauftragt, einige Optimierungstechniken zu finden. Wir haben ein Ladeproblem, weil alles träge abgerufen wird, und wenn wir versuchen, mit Groovy darauf zuzugreifen, wird Hibernate Tonnen von Anfragen regnen, was sehr lange dauert und unsere Anwendungen sehr langsam macht.

Also versuche ich unsere Find-Methode zu optimieren, um alles zu holen, was ich brauche, damit Hibernate nicht muss.

Hier ist meine Klasse:

 

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

Hier ist meine Kriterien:

 

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; 
    } 

Also muss ich Fluggesellschaft zugreifen und ein Kind eines jeden zu viele Listen.

Ich kann auf die Fluggesellschaft zugreifen, dort gibt es kein Problem. Wenn ich versuche, auf ein Objekt in der Liste zuzugreifen, wird es schwierig. Ich kann weder die Listen noch deren Kind laden (wie Sie aus meinen Kriterien sehen können, versuche ich in einer Liste auf das Land zuzugreifen und den Geschäftspartner in die andere Liste einzugeben). Ich erhalte diese Art von Anfrage für jeden Geschäftspartner:

Hibernate example

Also meine Frage ist: Ist es möglich, einen faulen Liste mit Kriterien zu holen? Und wenn ja wie?

Antwort

1

Also habe ich meine Antwort gefunden, wenn jemand auf dieser Post stolpert auf der Suche nach einer Antwort. Sie benötigen einen Aliasnamen für die Liste und geben Sie den joinType wie folgt zu erstellen:

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

Sie jede Sammlung mit Hibernate.initialize (Object) -Methode initialisiert werden konnte. In Ihrer DAO-Schicht müssen Sie nur das Vater-Objekt abrufen und diese Methode dann für jedes Kind aufrufen.

Verwandte Themen