Koruma sorunları

Bugün, sınıf hiyerarşisini veritabanına kaydetmek için Hazırda Bekletme özelliklerini kullanan yeni ve çok ilginç bir şemamız olacak.

Bir sınıf hiyerarşisi, bir kalıtım ilişkisiyle birbiriyle ilişkili bir sınıflar kümesidir.

Veritabanında depolamak istediğiniz üç sınıfınız olduğunu düşünün:

class User {
  int id;
  String name;
  LocalDate birthday;
}
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
class Client extends User {
   String address;
}

Sınıflar birbirinden miras alınır. Ve en ilginç olanı, bu sınıfların nesnelerini veritabanında depolamak için Hibernate'i kullanmak istemenizdir.

Çözüm türleri

Hibernate, bir sınıf hiyerarşisini veritabanındaki tablolarla ilişkilendirmek için 4 olası yola sahiptir:

  • EşlenmişSüper Sınıf
  • tek masa
  • Birleştirilmiş Tablo
  • Sınıf başına masa

Her strateji veritabanında kendi tablo yapısını varsayar. Bazen oldukça karmaşıktırlar. Ancak onlara yönelik HQL sorguları çok basittir. Hibernate'in avantajlarının açıkça ortaya çıktığı durum tam olarak budur.

Bu terimlerin Rusçaya çevrildiğini hiç duymadım, bu yüzden İngilizce olarak telaffuz etmenizi de tavsiye ederim.

Aşağıda her birinin ne anlama geldiğini analiz edeceğiz.

@MappedSuperClass

En basit çözümle başlayalım - veritabanında her sınıf için ayrı tablolarınız var . Örneğin, bunlar:

CREATE TABLE user {
  id INT,
  name VARCHAR,
  birthday DATE
}
CREATE TABLE employee {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE
}
CREATE TABLE client {
  id INT,
  name VARCHAR,
  birthday DATE,
  address VARCHAR
}

Bu tablolar için sınıfların bir hiyerarşide birbirine bağlı olduğunu yalnızca siz bilirsiniz . Hibernate'in bunu da bilmesini istiyorsanız, ana sınıfa @MappedSuperclass ek açıklamasını eklemeniz gerekir . Bu olmadan Hibernate, üst sınıfın alanlarını ve ek açıklamalarını yok sayacaktır.

Bu ek açıklamaya sahip sınıflar şöyle görünecektir:

@MappedSuperclass
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
class Client extends User {
   String address;
}

Bu, sınıf hiyerarşisi ile veritabanı arasında bağlantı kurmanın en ilkel yoludur. Bu yaklaşım aslında yalnızca sınıflarda yinelenen alanlardan kaçınmanıza izin verir.

HQL'deki veritabanı sorguları, yalnızca türü açıkça belirtilen varlığı döndürür. HQL'de bir veritabanı sorgusu yazıp tüm kullanıcıların bir listesini alamazsınız: Kullanıcı, Çalışan, İstemci.