22 Şubat 2021 Pazartesi

JPA @Inheritance + InheritanceType.JOINED

Giriş
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
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.
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