22 Mayıs 2018 Salı

JPA @Inheritance Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
JOINED, SINGLE_TABLE ve TABLE_PER_CLASS olabilir.
JOINED ile her sınıf kendi tablosuna sahiptir. Ata sınıf ile @PrimaryKeyJoinColumn anotasyonu ile birleşir.
SINGLE_TABLE'da tüm sınıflar tek tabloda saklanır.
TABLE_PER_CLASS'ı anlamadım. Kullanılmamalı deniliyor.

strategy JOINED
Ata sınıfı  tanımlamak için şöyle yaparız.
@Entity
@Table(name="person")
@Inheritance(strategy=InheritanceType.JOINED)
public class Person {
  ...  
}
strategy SINGLE_TABLE
Bir hiyerarşinin aynı tabloda saklanması durumunda kullanılır. Ata sınıfta şöyle yaparız.
@Entity
@Table(name = "PERSON")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name="discriminator",
    discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue(value="P")
public class Person {
 ...
}
Kalıtan sınıflarda ise Discriminator değer tanımlanır. Şöyle yaparız.
@Entity
@Table(name="PERSON")
@DiscriminatorValue("M")
public class Manager extends Person implements Serializable{
  ...
}
Örnek
Ata sınıfı tanımlamak için şöyle yaparız. Sınıf abstract olduğu için @DiscriminatorValue kullanılmıyor.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE",
  discriminatorType=DiscriminatorType.STRING,length=2)
public abstract class Foo implements Serializable {
  ...
}
Örnek
Ata sınıfı ve kalıtan sınıfı tanımlamak için şöyle yaparız.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "PART_TYPE")
@Table(name = "NAME")
public class NamePartEntity implements Comparable<NamePartEntity> {
  // Stuff
}

@Entity
@DiscriminatorValue(value = "GIV")
public class GivenNameEntity extends NamePartEntity {
  // stuff
}
Kalıtan sınıf için şu sql üretilir.
select this_.person_id as y0_ from name this_ where this_.part_type='GIV'
Örnek
Ata sınıfı tanımlamak için şöyle yaparız.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", length = 1,
   discriminatorType = DiscriminatorType.STRING)
public abstract class Media {
  ...
}
Kalıtan sınıfı tanımlamak için şöyle yaparız.
@Entity
@DiscriminatorValue("N")
public class NewsReport extends Media {
  ...
}


Hiç yorum yok:

Yorum Gönder