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:
Also meine Frage ist: Ist es möglich, einen faulen Liste mit Kriterien zu holen? Und wenn ja wie?