Java Persistence/ManyToOne

author
3 minutes, 8 seconds Read

Javassa ManyToOne-suhde tarkoittaa, että lähdeobjektilla on attribuutti, joka viittaa toiseen objektiin, kohdeobjektiin. Eli varsin tyypillinen Java-tapaus, jossa yhdellä objektilla on viittaus toiseen objektiin. ManyToOne-suhde voidaan määrittää yksisuuntaiseksi. On kuitenkin tyypillistä, että kohdeobjektilla on käänteinen suhde, joka on määritetty takaisin lähdeobjektiin. Tämä olisi OneToMany-suhteen määrittely kohdeobjektissa. Kaikki suhteet Javassa ja JPA:ssa ovat yksisuuntaisia, eli jos lähdeobjekti viittaa kohdeobjektiin, ei ole mitään takeita siitä, että kohdeobjektilla on myös suhde lähdeobjektiin. Tämä eroaa relaatiotietokannasta, jossa suhteet määritellään vierasavaimilla ja kyselyillä siten, että käänteinen kysely on aina olemassa.

JPA:ssa ManyToOne-suhde määritetään @ManyToOne-merkinnän tai <many-to-one>-elementin avulla. @ManyToOne-annotaatioon liittyy tyypillisesti @JoinColumn-annotaatio. @JoinColumn-annotaatiossa määritetään, miten suhde tulisi kuvata (ilmaista) tietokantaan. @JoinColumn määrittelee sen lähdeobjektin vieraan avaimen sarakkeen (@JoinColumn(name = "...")) nimen, jota tulisi käyttää kohdeobjektin etsimiseen (liittämiseen).

Jos kohdeobjektissa määritetään käänteinen OneToMany-suhde, kohdeobjektin @OneToMany-annotaation on sisällettävä mappedBy-attribuutti, jolla määritellään tämä käänteinen suhde.

JPA määrittelee myös OneToOne-suhteen, joka on samanlainen kuin ManyToOne-suhde, paitsi että käänteinen suhde (jos se olisi määritelty) on OneToOne-suhde. Tärkein ero OneToOne– ja ManyToOne-suhteen välillä JPA:ssa on se, että ManyToOne-suhde sisältää aina vieraan avaimen lähdeobjektin taulusta kohdeobjektin tauluun, kun taas OneToOne-suhteessa vieras avain voi olla joko lähdeobjektin taulussa tai kohdeobjektin taulussa.

Esimerkki ManyToOne-suhteesta databaseEdit

EMPLOYEE (taulukko)

EMP_ID FIRSTNAME LASTNAME SALARY MANAGER_ID
1 Bob Way 50000 2
2 Sarah Smith 75000 null

PUHELIN (taulukko)

ID TYPE AREA_CODE P_NUMBER OWNER_ID
1 home 613 792-0000 1
2 työ 613 896-1234 1
3 work 416 123-4444 2

Esimerkki ManyToOne-suhteesta annotationsEdit

@Entitypublic class Phone { @Id private long id; ... // Specifies the PHONE table does not contain an owner column, but // an OWNER_ID column with a foreign key. And creates a join to // lazily fetch the owner @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="OWNER_ID") private Employee owner; ...}// Specification of the reverse OneToMany relationship in Employee@Entitypublic class Employee { @Id private long emp_id; ... // The 'mappedBy = "owner"' attribute specifies that // the 'private Employee owner;' field in Phone owns the // relationship (i.e. contains the foreign key for the query to // find all phones for an employee.) @OneToMany(mappedBy = "owner") private List<Phone> phones; ...

Example of a ManyToOne suhde XMLEdit

<entity name="Phone" class="org.acme.Phone" access="FIELD"> <attributes> <id name="id"/> <many-to-one name="owner" fetch="LAZY"> <join-column name="OWNER_ID"/> </many-to-one> </attributes></entity>

Katso myösEdit

  • Suhteet
    • Cascading
    • Lazy Fetching
    • Kohdeentiteetti
    • Liitännäishaku
    • Erälukeminen
    • Yleisiä ongelmia
  • OneToOne
    • Kartoitus a OneToOne Using a Join Table
  • OneToMany

Common ProblemsEdit

Foreign key is also part of the primary key.Edit

Katso Ensisijaiset avaimet OneToOne-suhteiden kautta.

Vierasavain on myös kartoitettu perusavaimeksi.Muokkaa

Jos käytät samaa kenttää kahdessa eri kartoituksessa, joudut yleensä muuttamaan toisen niistä vain lukuoikeudeksi käyttämällä insertable, updatable = false. Katso Kohde Foreign Keys, Primary Key Join Columns, Cascade Primary Keys.

Rajoitusvirhe lisäämisessä.Muokkaa

Tämä johtuu yleensä siitä, että olet kartoittanut vieraan avaimen väärin OneToOne-suhteessa.Katso kohdat Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys. Vika voi ilmetä myös, jos JPA-palveluntarjoajasi ei tue viittauksellista eheyttä tai ei ratkaise kaksisuuntaisia rajoituksia. Tällöin sinun on ehkä joko poistettava rajoitus tai käytettävä EntityManager flush() varmistaaksesi, että objektit kirjoitetaan oikeassa järjestyksessä.

Foreign key value is nullEdit

Varmista, että asetat objektin OneToOne arvon, jos OneToOne on osa kaksisuuntaista OneToMany-suhdetta, varmista, että asetat objektin OneToOne arvon, kun lisäät objektin OneToMany:een, JPA ei ylläpidä kaksisuuntaisia suhteita puolestasi. Tarkista myös, että olet määrittänyt JoinColumn oikein, varmista, ettet ole asettanut insertable, updateable = false tai käyttänyt PrimaryKeyJoinColumn.

Similar Posts

Vastaa

Sähköpostiosoitettasi ei julkaista.