Yazılımcıların en çok kullandığı en rahat anladıkları JPA kalıtım yöntemi bu. Veri sınıflar benzer şekilde farklı tablolarda tutulur. Ata ve kalıtan sınıflar birbirlerine foreign key ile bağlanır. Bu yüzden JOIN yapılabilir. Yani veri normalizasyona tabi tutulur.
Açıklaması şöyle.
Şöyle yaparız.
The tables are joined via foreign key constraints to the table of their superclass, which contains columns for the inherited properties. Polymorphic queries would use JOIN in the SQL statements using the foreign key columns.Örnek
Şöyle yaparız.
@Entity
@Table(name="person")
@Inheritance(strategy=InheritanceType.JOINED)
public class Person {
@Id
@GeneratedValue
@Column(name="person_id")
private int personId;
@Column(name="name")
private String name;
}
@Entity
@Table(name="employee")
@PrimaryKeyJoinColumn(name="person_id")
public class Employee extends Person {
@GeneratedValue
@Column(name="employee_id")
private int employeeId;
@Column(name="salary")
private int salary;
}
@Entity
@Table(name = "manager")
@PrimaryKeyJoinColumn(name = "employee_id")
public class Manager extends Employee{
private String branch;
}
Manager nesnesine erişmek için üretilen SQL şöyledir
SELECT
manager0_.id as id1_4_0_,
manager0_2_.name as name2_4_0_,
manager0_1_.employee_id as employee1_1_0_,
manager0_1_.salary as salary2_1_0_,
manager0_.branch as branch1_2_0_
FROM
manager manager0_
INNER JOIN
employee manager0_1_ on manager0_.id=manager0_1_.id
INNER JOIN
person manager0_2_ on manager0_.id=manager0_2_.id
WHERE
manager0_.id=?
Örnek
Şöyle yaparız
@Entity@Inheritance(strategy = InheritanceType.JOINED)public abstract class Devices {@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;@Column(name="brand")private String brand;@Column(name="name")private String name;}@Entity@PrimaryKeyJoinColumn(name = "computerId")public class Computer extends Devices {private String oS;...}@Entity@PrimaryKeyJoinColumn(name = "mobilephoneId")public class MobilePhone extends Devices{private String color;...}
Örnek
Title alanına göre tüm Publication'ları çekmek isteseydik SQL şöyle olur. Burada okumayı kolaylaştırmak için sadece id alanını bıraktım. Diğer alanları sildim. SQL'de iki tane Publication'dan kalıtan Book ve Magazine sınıfları olduğu için iki tane left outer join görülebilir.
Title alanına göre tüm Publication'ları çekmek isteseydik SQL şöyle olur. Burada okumayı kolaylaştırmak için sadece id alanını bıraktım. Diğer alanları sildim. SQL'de iki tane Publication'dan kalıtan Book ve Magazine sınıfları olduğu için iki tane left outer join görülebilir.
select publicatio0_.id ,,,
from Publication publicatio0_
left outer join
Book publicatio0_1_
on publicatio0_.id=publicatio0_1_.id
left outer join
Magazine publicatio0_2_
on publicatio0_.id=publicatio0_2_.id
where publicatio0_.title=?
Hiç yorum yok:
Yorum Gönder