Tablo Düzeyinde İlişki

İki tablomuza tekrar bakalım:

İD isim meslek maaş yaş katılmak_tarihi
1 İvanov İvan Programcı 100000 25 2012-06-30
2 Petrov Petr Programcı 80000 23 2013-08-12
3 İvanov Sergey test cihazı 40000 otuz 2014-01-01
4 Rabinovich Moisha Müdür 200000 35 2015-05-12
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 2015-10-10
6 Vaska Kedi 1000 3 2018-11-11

çalışan tablosu:

Bu tablo aşağıdaki sütunlara sahiptir:

  • kimlik INT
  • isim VARCHAR
  • meslek VARCHA
  • maaş INT
  • yaş INT
  • katılım_tarihi DATE

Çalışanlar için görevleri içeren görev tablosu şu şekilde görünür:

İD çalışan kimliği isim son teslim tarihi
1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15
3 5 kahve satın al 2022-07-01
4 5 kahve satın al 2022-08-01
5 5 kahve satın al 2022-09-01
6 (HÜKÜMSÜZ) ofisi temizle (HÜKÜMSÜZ)
7 4 Hayatın tadını çıkar (HÜKÜMSÜZ)
8 6 Hayatın tadını çıkar (HÜKÜMSÜZ)

Bu tabloda yalnızca 4 sütun vardır:

  • id , görevin (ve tablodaki satırların) benzersiz sayısıdır.
  • çalışan_kimliği - Görevin atandığı çalışan tablosundaki çalışanın kimliği.
  • ad - görevin adı ve açıklaması.
  • son tarih - görevin tamamlanması gereken süre.

Çalışan tablosundaki tek bir giriş, görev tablosundaki birçok satır tarafından referans alınabilir. Böyle bir tablo düzeyinde ilişki, bire çok olarak adlandırılır .

Java sınıfı düzeyiyle ilişki

Ve sınıflarımız, Çalışan sınıfı :

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

Ve orijinal haliyle, EmployeeTask sınıfı:

@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 notu

Entity sınıfları arasındaki iletişimi farklı bir şekilde düzenleyebiliriz.

Üst sınıfta bir alt nesne koleksiyonu oluşturmak için kullandığımız @ElementCollection ek açıklamasını hatırlıyor musunuz ? @OneToMany notuyla benzer bir şey yapılabilir . Sadece bu sefer, Çalışan sınıfı değiştirilecek :

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

@OneToMany ek açıklamasını kullanarak , nesneninçalışanbirçok ÇalışanGörevi nesnesini saklayabilir . Ayrıca @JoinColumn ek açıklamasını kullanarak , nesne kimliğinin görev tablosunun hangi sütununda saklandığını belirttik.çalışan.

Ancak, Çalışan Görevi sınıfı genellikle çalışan_kimliği sütununa başvuran bir alan içermez. Örnek:

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

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

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

Çalışan_kimliği alanı bir hizmet alanı olarak kabul edilir ve değeri Hibernate tarafından kontrol edilir.

İstek örnekleri

Bir çalışana bir görev eklemek istiyorsanız, aşağıdaki gibi bir kod yazmanız gerekir:

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

Öncelikle iki tane EmployeeTask nesnesi oluşturup bunları veri tabanına kaydedip, INSERT işleminin gerçekleşmesi ve nesnelerin ID'lerinin olması için flush() metodunu çağırıyoruz.

Daha sonra veritabanında direktörü bulup ondan görevler alanını alıp ona iki görev ekliyoruz. Daha sonra direktörü veri tabanına kaydediyoruz. Bundan sonra, veritabanında yeni görevler için çalışan_id sütununda - çalışan tablosundaki yöneticinin kimliği olan 4 değeri görünecektir.

Önemli! Veritabanındaki tablolar, @ManyToOne ve @OneToMany ek açıklamaları için aynıdır . Ancak bu tablolar için Java sınıfları farklıdır.