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.
GO TO FULL VERSION