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
- Esimerkki ManyToOne-suhteesta annotationsEdit
- Example of a ManyToOne suhde XMLEdit
- Katso myösEdit
- Common ProblemsEdit
- Foreign key is also part of the primary key.Edit
- Vierasavain on myös kartoitettu perusavaimeksi.Muokkaa
- Rajoitusvirhe lisäämisessä.Muokkaa
- Foreign key value is nullEdit
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
.