Tanım
Bir sınıf hiyerarşisini bir veritabanında depolamak için başka bir stratejiye Birleşik Tablo denir. Bunun için özel bir açıklama var:
@Inheritance(strategy = InheritanceType.JOINED)
Sınıflarımızdan bir örnek:
@Inheritance(strategy = InheritanceType.JOINED)
@Entity
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 ek açıklamayı kullanırken Hibernate, veritabanında her sınıf ve alt sınıfları için ayrı bir tablo bekler. Onlardan veri seçerken, SQL JOIN operatörünü kullanmanız gerekecek.
Veritabanı şeması örneği:
CREATE TABLE user {
id INT,
name VARCHAR,
birthday DATE
}
CREATE TABLE employee {
id INT,
occupation VARCHAR,
salary INT,
join DATE
}
CREATE TABLE client {
id INT,
address VARCHAR
}
Tablodan bir müşterinin verilerini almaya karar verirseniz, Hazırda Bekletme, tablolara katılmak için JOIN'i kullanmak zorunda kalacaktır:
SELECT u.id, u.name, u.birthday, c.address FROM user u JOIN client c ON u.id = c.id;
@PrimaryKeyJoinColumn
Alt Varlık sınıfları, tabloda üst Varlık sınıfının nesne kimliğine atıfta bulunan bir sütuna sahiptir. Bu sütunun adı varsayılan olarak üst sınıfın sütununun adına eşittir.
Örnek:
@Inheritance(strategy = InheritanceType.JOINED)
@Entity
class User {
@Id
int user_identifier;
String name;
LocalDate birthday;
}
@Entity
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
@Entity
class Client extends User {
String address;
}
Ardından veritabanı tablosu şöyle görünecektir:
CREATE TABLE user {
user_identifier INT,
name VARCHAR,
birthday DATE
}
CREATE TABLE employee {
user_identifier INT,
occupation VARCHAR,
salary INT,
join DATE
}
CREATE TABLE client {
user_identifier INT,
address VARCHAR
}
Bağımlı tablolarda sütun adını geçersiz kılmak istiyorsanız, @PrimaryKeyJoinColumn açıklamasını kullanmanız gerekir . Örnek:
@Inheritance(strategy = InheritanceType.JOINED)
@Entity
class User {
@Id
int user_identifier;
String name;
LocalDate birthday;
}
@Entity
@PrimaryKeyJoinColumn(name=”user_id”)
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
@Entity
@PrimaryKeyJoinColumn(name=”user_id2”)
class Client extends User {
String address;
}
Ardından veritabanı tablosu şöyle görünecektir:
CREATE TABLE user {
user_identifier INT,
name VARCHAR,
birthday DATE
}
CREATE TABLE employee {
user_id INT,
occupation VARCHAR,
salary INT,
join DATE
}
CREATE TABLE client {
user_id2 INT,
address VARCHAR
}
GO TO FULL VERSION