Java >> Java tutorial >  >> Tag >> String

Hibernate Tips:Sådan fortsætter du en liste over strenge som en ElementCollection

Hibernate Tips er en række indlæg, hvor jeg beskriver en hurtig og nem løsning på almindelige Hibernate-spørgsmål. Hvis du har et spørgsmål til et fremtidigt Hibernate Tip, bedes du efterlade en kommentar nedenfor.

Spørgsmål:

Jeg har brug for at fortsætte en simpel liste af streng s. Skal jeg virkelig oprette en ekstra enhed til det?

Løsning:

Siden JPA 2.0 kan du bruge en elementsamling til at bevare en samling af værdityper. Du skal blot annotere attributten med @ElementCollection og persistensudbyderen vil bevare elementerne i Samlingen i en ekstra databasetabel.

@Entity
public class Author {

	@ElementCollection
	private List<String> phoneNumbers = new ArrayList<String>();

	...
}

Elementsamlingen kan virke nemmere at bruge end en enhed med en en-til-mange-tilknytning. Men det har en stor ulempe:Elementerne i samlingen har intet id, og Hibernate kan ikke adressere dem individuelt.

Når du tilføjer et nyt objekt til listen eller fjern en eksisterende, sletter Hibernate alle elementer og indsætter en ny post for hvert element i Listen .

Lad os tage et hurtigt kig på et eksempel. Følgende kodestykke vælger en Forfatter enhed og tilføjer et andet telefonnummer til elementsamlingen.

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

Author a = em.find(Author.class, 1L);
a.getPhoneNumbers().add("42424242");

em.getTransaction().commit();
em.close();

Når du udfører denne kode, udfører Hibernate 2 SELECT-sætninger for at læse Author enhed og de tilknyttede telefonnumre . Så tilføjer jeg det andet telefonnummer til elementsamlingen. Og Hibernate opdaterer Forfatteren enhed, sletter alle tilknyttede telefonnumre og indsætter en ny post for hvert telefonnummer .

14:53:13,371 DEBUG [org.hibernate.SQL] - 
    select
        author0_.id as id1_0_0_,
        author0_.firstName as firstNam2_0_0_,
        author0_.lastName as lastName3_0_0_,
        author0_.version as version4_0_0_ 
    from
        Author author0_ 
    where
        author0_.id=?
14:53:13,427 DEBUG [org.hibernate.SQL] - 
    select
        phonenumbe0_.Author_id as Author_i1_1_0_,
        phonenumbe0_.phoneNumbers as phoneNum2_1_0_ 
    from
        Author_phoneNumbers phonenumbe0_ 
    where
        phonenumbe0_.Author_id=?
14:53:13,480 DEBUG [org.hibernate.SQL] - 
    update
        Author 
    set
        firstName=?,
        lastName=?,
        version=? 
    where
        id=? 
        and version=?
14:53:13,491 DEBUG [org.hibernate.SQL] - 
    delete 
    from
        Author_phoneNumbers 
    where
        Author_id=?
14:53:13,494 DEBUG [org.hibernate.SQL] - 
    insert 
    into
        Author_phoneNumbers
        (Author_id, phoneNumbers) 
    values
        (?, ?)
14:53:13,496 DEBUG [org.hibernate.SQL] - 
    insert 
    into
        Author_phoneNumbers
        (Author_id, phoneNumbers) 
    values
        (?, ?)

Som du kan se, er en elementsamling en nem, men ikke den mest effektive mulighed for at gemme en liste over værdityper i databasen. Du bør derfor kun bruge det til meget små samlinger, så Hibernate ikke udfører for mange SQL-sætninger. I alle andre tilfælde er en en-til-mange-forening den bedste tilgang.

Få flere oplysninger:

Inden du bruger en elementsamling, bør du tage et kig på kortlægningen af ​​mange-til-en associationer. JPA og Hibernate gør dem meget nemme at bruge, og Hibernate kan håndtere dem mere effektivt.


Dvaletipsbog







Få flere opskrifter som denne i min nye bog Hibernate Tips:Mere end 70 løsninger på almindelige dvaleproblemer.

Den giver dig mere end 70 klar-til-brug opskrifter til emner som grundlæggende og avancerede kortlægninger, logning, Java 8-understøttelse, caching og statisk og dynamisk definerede forespørgsler.

Få det nu!



Java tag