@Bire bir

All lectures for TR purposes
Seviye , Ders
Mevcut

5.1 Bire bir iletişimin çeşitli biçimleri

İki Entity sınıfı arasındaki ilişkinin başka ilginç ve oldukça özel bir durumu daha vardır - bire bir ilişki.

Bir veritabanından çok Java nesneleri hakkında olduğu için bu durumu çok özel olarak adlandırıyorum. Veritabanında, tablolar arasındaki ilişki için yalnızca iki seçenek vardır:

  • Tablo satırı, başka bir tablonun kimliğine bir bağlantı içerir.
  • Hizmet tablosu çoktan çoğa ilişkiler için kullanılır.

Varlık sınıfları söz konusu olduğunda, birkaç ek açıklama ile açıklanan seçenekler olabilir:

  • @Gömülü
  • Tek taraflı OneToOne
  • İkili BireBir
  • @MapsId

Aşağıda en popülerlerini ele alacağız.

5.2 Gömülü

Bu arada, en basit bire bir iletişim seçeneğini zaten düşündük - bu bir açıklama @Embedded. Bu durumda, veritabanında aynı tabloda saklanan iki sınıfımız var.

Diyelim ki kullanıcının adresini UserAddress sınıfında saklamak istiyoruz :


@Embeddable
class UserAddress {
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
}

Ardından, User sınıfına bu adrese sahip bir alan eklememiz yeterlidir :


@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;
 
   @Embedded
   public UserAddress address;
 
   @Column(name="created_date")
   public Date createdDate;
}

Hazırda bekletme gerisini halleder: veriler tek bir tabloda depolanır, ancak HQL sorguları yazarken sınıf alanlarında işlem yapmanız gerekir.

HQL sorgu örneği:

select from User where address.city = 'Paris'

5.3 Tek Taraflı BireBir

Şimdi durumu hayal edin: bir kaynak tablo çalışanımız ve çalışana atıfta bulunan bir görevimiz var. Ancak bir kullanıcıya en fazla bir görev atanabileceğini kesin olarak biliyoruz. O zaman ek açıklamayı bu durumu açıklamak için kullanabiliriz @OneToOne.

Örnek:


@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String description;
 
   @OneToOne
   @JoinColumn(name = "employee_id")
   public Employee employee;
 
   @Column(name="deadline")
   public Date deadline;
}

Hazırda Bekletme, yalnızca bir görevin bir kullanıcısı olmasını değil, aynı zamanda bir kullanıcının yalnızca bir görevi olmasını sağlar. Aksi takdirde, bu durum pratik olarak @ManyToOne.

5.4 İkili Birebir

Önceki seçenek biraz rahatsız edici olabilir, çünkü genellikle bir çalışanı yalnızca bir göreve atamak değil, aynı zamanda bir çalışana bir görev atamak istersiniz.

Bunu yapmak için, Çalışan sınıfına ÇalışanGörevi alanını ekleyebilir ve ona doğru ek açıklamaları verebilirsiniz.


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToOne(cascade = CascadeType.ALL, mappedBy="employee")
   private EmployeeTask task;
}

Önemli!Çalışan tablosunun task_id alanı yoktur , bunun yerine görev tablosunun staff_id alanı tablolar arasında ilişki kurmak için kullanılır .

Nesneler arasında bir bağlantı kurmak şöyle görünür:


Employee director = session.find(Employee.class, 4);
EmployeeTask task = session.find(EmployeeTask.class, 101);
task.employee = director;
director.task = task;
 
session.update(task);
session.flush();

Bağlantıyı kaldırmak için, bağlantıların her iki nesneden de kaldırılması gerekir:


Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.task;
 
task.employee = null;
session.update(task);
 
director.task = null;
session.update(director);
 
session.flush();

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