Forhold på tabellnivå

La oss se på de to tabellene våre igjen:

id Navn okkupasjon lønn alder join_date
1 Ivanov Ivan Programmerer 100 000 25 2012-06-30
2 Petrov Petr Programmerer 80 000 23 2013-08-12
3 Ivanov Sergey Tester 40 000 tretti 2014-01-01
4 Rabinovich Moisha Regissør 200 000 35 2015-05-12
5 Kirienko Anastasia Kontorsjef 40 000 25 2015-10-10
6 Vaska Katt 1000 3 2018-11-11

ansatttabell:

Denne tabellen har følgende kolonner:

  • ID INT
  • navn VARCHAR
  • yrke VARCHA
  • lønn INT
  • alder INT
  • join_date DATE

Og slik ser oppgavetabellen , som inneholder oppgaver for ansatte, ut:

id emploee_id Navn frist
1 1 Rett opp en feil på frontend 2022-06-01
2 2 Rett opp en feil på backend 2022-06-15
3 5 Kjøp kaffe 2022-07-01
4 5 Kjøp kaffe 2022-08-01
5 5 Kjøp kaffe 2022-09-01
6 (NULL) Rydd opp på kontoret (NULL)
7 4 Nyt livet (NULL)
8 6 Nyt livet (NULL)

Denne tabellen har bare 4 kolonner:

  • id er det unike nummeret til oppgaven (og rader i tabellen).
  • ansatt_id - ID for den ansatte fra ansatttabellen som oppgaven er tilordnet.
  • navn - navnet og beskrivelsen av oppgaven.
  • deadline - tidspunktet for når oppgaven skal være fullført.

En enkelt oppføring i ansatttabellen kan refereres av mange rader i oppgavetabellen. En slik relasjon på tabellnivå kalles en-til -mange.

Forholdet til Java-klassenivået

Og våre klasser, Ansatt- klassen :

@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String name;

   @Column(name="occupation")
   public String occupation;

   @Column(name="salary")
   public Integer salary;

   @Column(name="join_date")
   public Date join;
}

Og EmployeeTask- klassen i sin opprinnelige form:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @Column(name="employee_id")
   public Integer employeeId;

   @Column(name="deadline")
   public Date deadline;
}

@OneToMany-kommentar

Vi kan arrangere kommunikasjon mellom Entity-klasser på en annen måte.

Husker du @ElementCollection- kommentaren som vi brukte til å lage en samling av underordnede objekter i den overordnede klassen? Noe lignende kan gjøres med @OneToMany -kommentaren . Bare denne gangen vil Employee- klassen bli endret :

@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL)
   @JoinColumn(name = "employee_id")
   private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}

Ved å bruke @OneToMany -kommentaren indikerte vi at objektetansattkan lagre mange EmployeeTask- objekter . Ved å bruke @JoinColumn- kommentaren indikerte vi også i hvilken kolonne i oppgavetabellen objekt-ID-en er lagretansatt.

EmployeeTask -klassen inneholder imidlertid vanligvis ikke et felt som refererer til kolonnen ansatt_id. Eksempel:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @Column(name="deadline")
   public Date deadline;
}

Medarbeider-id-feltet regnes som et tjenestefelt, og verdien kontrolleres av Hibernate.

Be om eksempler

Hvis du vil legge til en oppgave til en arbeider, må du skrive kode slik:

EmployeeTask task1 = new EmployeeTask();
task1.description = "Do Something Important";
session.persist(task1);

EmployeeTask task2 = new EmployeeTask();
task2.description = "Nothing to do";
session.persist(task2);
session.flush();

Employee director = session.find(Employee.class, 4);
director.tasks.add(task1);
director.tasks.add(task2);

session.update(director);
session.flush();

Først lager vi to EmployeeTask- objekter , lagrer dem i databasen og kaller opp flush()- metoden slik at INSERT-operasjonen utføres og objektene har IDer.

Så finner vi direktøren i databasen, tar oppgavefeltet fra ham og legger til to oppgaver til ham. Deretter lagrer vi direktøren i databasen. Etter det vil verdien 4 vises i databasen for nye oppgaver i kolonnen ansatt_id - id-en til direktøren i ansatttabellen.

Viktig! Tabellene i databasen er de samme for @ManyToOne- og @OneToMany -kommentarene . Men Java-klassene for disse tabellene er forskjellige.