Sök…


Använd inte EAGER-hämtningstyp

Hibernate kan använda två typer av hämtning när du kartlägger förhållandet mellan två enheter: EAGER och LAZY .

I allmänhet är EAGER hämtningstypen inte bra, eftersom den säger till JPA att alltid hämta uppgifterna, även om dessa uppgifter inte är nödvändiga.

Exempelvis om du har en Person enhet och förhållandet till Address som detta:

@Entity
public class Person {

  @OneToMany(mappedBy="address", fetch=FetchType.EAGER)
  private List<Address> addresses;

}

Varje gång du frågar en Person kommer listan med Address för denna Person att returneras.

Så istället för att kartlägga din enhet med:

@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)

Använda sig av:

@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)

En annan sak att uppmärksamma är relationerna @OneToOne och @ManyToOne . Båda är som standard EAGER. Så om du är orolig för hur din ansökan fungerar måste du ställa in hämtningen för den här typen av relation:

@ManyToOne(fetch=FetchType.LAZY)

Och:

@OneToOne(fetch=FetchType.LAZY)

Använd sammansättning istället för arv

Viloläge har några arvsstrategier. Den JOINED gör en JOIN mellan barnenheten och moderföretaget.

Problemet med detta tillvägagångssätt är att Viloläge alltid tar med sig data från alla involverade tabeller i arvet.

Exempelvis om du har enheterna Bicycle och MountainBike använder den JOINED :

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {

}

Och:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {

}

Alla JPQL-frågor som träffar MountainBike kommer med Bicycle och skapar en SQL-fråga som:

select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...

Om du har en annan förälder för Bicycle (som exempelvis Transport , per exempel), kommer den här frågan att föra informationen från den här föräldern också, vilket gör en extra JOIN.

Som ni ser är detta också en typ av EAGER kartläggning. Du har inte valet att bara ta med data från MountainBike tabellen med denna arvstrategi.

Det bästa för prestanda är användningskomposition istället för arv.

För att uppnå detta kan du kartlägga MountainBike enheten för att ha en bicycle :

@Entity
public class MountainBike {

    @OneToOne(fetchType = FetchType.LAZY)
    private Bicycle bicycle;

}

Och Bicycle :

@Entity
public class Bicycle {

}

Varje fråga nu kommer bara med MountainBike data som standard.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow