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.