CodeGym /Java kurs /SQL & Hibernate /@En till mÄnga

@En till mÄnga

SQL & Hibernate
NivÄ , Lektion
TillgÀngliga

Relation pÄ tabellnivÄ

LÄt oss titta pÄ vÄra tvÄ tabeller igen:

id namn ockupation lön Älder join_date
1 Ivanov Ivan Programmerare 100 000 25 2012-06-30
2 Petrov Petr Programmerare 80 000 23 2013-08-12
3 Ivanov Sergey Testare 40 000 trettio 2014-01-01
4 Rabinovich Moisha Direktör 200 000 35 2015-05-12
5 Kirienko Anastasia Kontors chef 40 000 25 2015-10-10
6 Vaska Katt 1000 3 2018-11-11

anstÀlld tabell:

Den hÀr tabellen har följande kolumner:

  • id INT
  • namn VARCHAR
  • yrke VARCHA
  • lön INT
  • Ă„lder INT
  • join_date DATE

Och sÄ hÀr ser uppgiftstabellen ut, som innehÄller uppgifter för anstÀllda:

id emploee_id namn deadline
1 1 Fixa en bugg pÄ frontend 2022-06-01
2 2 Fixa en bugg pÄ backend 2022-06-15
3 5 Köp kaffe 2022-07-01
4 5 Köp kaffe 2022-08-01
5 5 Köp kaffe 2022-09-01
6 (NULL) StÀda kontoret (NULL)
7 4 Njut av livet (NULL)
8 6 Njut av livet (NULL)

Den hÀr tabellen har bara 4 kolumner:

  • id Ă€r det unika numret för uppgiften (och rader i tabellen).
  • anstĂ€lld_id - ID för den anstĂ€llde frĂ„n den anstĂ€llde tabellen som uppgiften Ă€r tilldelad.
  • namn - namnet och beskrivningen av uppgiften.
  • deadline - den tidpunkt dĂ„ uppgiften ska vara klar.

En enskild post i anstÀlldstabellen kan refereras av mÄnga rader i uppgiftstabellen. En sÄdan relation pÄ tabellnivÄ kallas en-till- mÄnga.

Relation till Java-klassnivÄn

Och vÄra klasser, klassen AnstÀlld :

@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;
}

Och EmployeeTask -klassen i sin ursprungliga 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-anteckning

Vi kan ordna kommunikation mellan Entity-klasser pÄ ett annat sÀtt.

Kommer du ihÄg @ElementCollection- anteckningen som vi anvÀnde för att skapa en samling av underordnade objekt i den överordnade klassen? NÄgot liknande kan göras med @OneToMany -kommentaren . Endast den hÀr gÄngen kommer klassen AnstÀlld Àndras :

@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>();
}

Med @OneToMany -anteckningen angav vi att objektetanstÀlldkan lagra mÄnga EmployeeTask- objekt . Med hjÀlp av @JoinColumn -kommentaren angav vi ocksÄ i vilken kolumn i uppgiftstabellen objekt-id:t Àr lagratanstÀlld.

EmployeeTask -klassen innehÄller dock vanligtvis inte ett fÀlt som hÀnvisar till kolumnen werknemer_id. Exempel:

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

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

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

FÀltet anstÀlld_id anses vara ett tjÀnstefÀlt och dess vÀrde styrs av Hibernate.

BegÀr exempel

Om du vill lÀgga till nÄgon uppgift till nÄgon arbetare, mÄste du skriva kod sÄ hÀr:

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 skapar vi tvÄ EmployeeTask- objekt , sparar dem i databasen och anropar metoden flush() sÄ att INSERT-operationen utförs och objekten har ID:n.

Sedan hittar vi regissören i databasen, tar uppgiftsfÀltet frÄn honom och lÀgger till tvÄ uppgifter till honom. Sedan sparar vi regissören till databasen. DÀrefter kommer vÀrdet 4 att dyka upp i databasen för nya uppgifter i kolumnen för anstÀllda_id - regissörens id i tabellen för anstÀllda.

Viktig! Tabellerna i databasen Àr desamma för @ManyToOne- och @OneToMany -annoteringarna . Men Java-klasserna för dessa tabeller Àr olika.

Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION