Táblázat szintű kapcsolat

Nézzük még egyszer a két táblázatunkat:

id név Foglalkozása fizetés kor csatlakozás dátuma
1 Ivanov Iván Programozó 100 000 25 2012-06-30
2 Petrov Petr Programozó 80000 23 2013-08-12
3 Ivanov Szergej Vizsgáló 40000 harminc 2014-01-01
4 Rabinovics Moisa Rendező 200 000 35 2015-05-12
5 Kirienko Anasztázia Irodavezető 40000 25 2015-10-10
6 Vaska Macska 1000 3 2018-11-11

alkalmazotti táblázat:

Ez a táblázat a következő oszlopokat tartalmazza:

  • azonosító INT
  • név VARCHAR
  • foglalkozás VARCHA
  • fizetés INT
  • kor INT
  • csatlakozási_dátum DATE

Így néz ki az alkalmazottak feladatait tartalmazó feladattábla :

id employee_id név határidő
1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
2 2 Javítson ki egy hibát a háttérben 2022-06-15
3 5 Vegyél kávét 2022-07-01
4 5 Vegyél kávét 2022-08-01
5 5 Vegyél kávét 2022-09-01
6 (NULLA) Takarítsd ki az irodát (NULLA)
7 4 Élvezd az életet (NULLA)
8 6 Élvezd az életet (NULLA)

Ez a táblázat csak 4 oszlopot tartalmaz:

  • id a feladat egyedi száma (és a táblázat sorai).
  • munkavállaló_azonosítója – annak az alkalmazottnak az azonosítója az alkalmazotti táblából, amelyhez a feladat hozzá van rendelve.
  • név - a feladat neve és leírása.
  • határidő - az az idő, ameddig a feladatot el kell végezni.

Az alkalmazotti tábla egyetlen bejegyzésére a feladattábla több sora hivatkozhat. Az ilyen táblaszintű kapcsolatot egy- a-többhöz nevezzük.

Kapcsolat a Java osztályszinttel

És az osztályaink, az alkalmazotti osztály :

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

És az EmployeeTask osztály eredeti formájában:

@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 kommentár

Az Entity osztályok közötti kommunikációt más módon is meg tudjuk szervezni.

Emlékszel az @ElementCollection annotációra , amellyel a szülőosztályban utód objektumok gyűjteményét hoztuk létre? Valami hasonlót lehet tenni a @OneToMany annotációval . Csak ezúttal az Alkalmazottak osztálya módosul :

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

A @OneToMany megjegyzés használatával jeleztük, hogy az objektummunkavállalósok EmployeeTask objektumot tárolhat . Ezenkívül a @JoinColumn megjegyzés segítségével jeleztük, hogy a feladattábla melyik oszlopában van tárolva az objektumazonosítómunkavállaló.

Az EmployeeTask osztály azonban általában nem tartalmaz olyan mezőt, amely a munkavállalói_azonosító oszlopra hivatkozik. Példa:

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

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

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

Az alkalmazott_azonosító mező szolgáltatási mezőnek minősül, és értékét a Hibernate szabályozza.

Kérjen példákat

Ha valamilyen feladatot szeretne hozzáadni néhány dolgozóhoz, akkor a következő kódot kell írnia:

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

Először létrehozunk két EmployeeTask objektumot , elmentjük őket az adatbázisba, és meghívjuk a flush() metódust , hogy az INSERT művelet végrehajtásra kerüljön, és az objektumoknak azonosítójuk legyen.

Ezután megkeressük az adatbázisban a rendezőt, kivesszük tőle a feladatok mezőt és hozzáadunk két feladatot. Ezután elmentjük a rendezőt az adatbázisba. Ezt követően a 4-es érték jelenik meg az adatbázisban az új feladatoknál a munkavállalói_id oszlopban - az igazgató azonosítója az alkalmazotti táblában.

Fontos! Az adatbázisban lévő táblázatok megegyeznek a @ManyToOne és a @OneToMany megjegyzésekkel . De ezeknek a tábláknak a Java osztályai eltérőek.