8 Mayıs 2018 Salı

JPA @Embeddable Anotasyonu

Giriş
Bir tabloda çok fazla alan varsa ve sütunları mantıksal olarak bir nesne altında gruplamak uygunsa kullanırız. Embeddable nesnesindeki alanlar içinde bulunduğu nesnenin tablosuna yazılır.

Kullanım Şekli
En faydalı olduğu yer birden fazla sınıfa alan eklemek istersek kolayca yapabilmemizi sağlaması. Önce bir sınıf tanımlanıyor.
@Embeddable
class Audit {
  Timestamp created;
  String createdBy;
  String updatedBy;
}
Daha sonra sınıf Entity sınıfına ekleniyor.
@Entity
class Order {
   @Embedded
   Audit audit;
}
Kalıtım
Şöyle yaparız.
@MappedSuperclass
@Embeddable
public class Foo {
  //  atributes...
}

@Embeddable
public class Bar extends Foo {
  // atributes...
}

@Entity  
@Table
public class None {

  // atributes...

  @Embedded
  private Bar bar;

}
@AttributeOverrides Anotasyonu
Embeddable ile çok kullanılan bir diğer anotasyon ise AttributeOverrides. Bu anotasyon ile nesnenin başka bir yerde tanımlanmış özelliği değiştiriliyor. Aşağıdaki kodda Address için farklı sütun isimleri kullanılıyor.
@Embeddable
public class Address {
  String email;
  String address;
  String city; 
  String state;
  String zip;
  String country;
}

@Entity
@Table(name="customer")
public class Customer {
  @Embedded
  @AttributeOverrides({
    @AttributeOverride(name="address", column=@Column(name="ship_addr"),
    @AttributeOverride(name="city", column=@Column(name="ship_city"),
    @AttributeOverride(name="state", column=@Column(name="ship_state"),
    @AttributeOverride(name="zip", column=@Column(name="ship_zip"),
    @AttributeOverride(name="country", column=@Column(name="ship_country")
  })
  Address shippingAddress;

  @Embedded
  @AttributeOverrides({
    @AttributeOverride(name="address", column=@Column(name="bill_addr"),
    @AttributeOverride(name="city", column=@Column(name="bill_city"),
    @AttributeOverride(name="state", column=@Column(name="bill_state"),
    @AttributeOverride(name="zip", column=@Column(name="bill_zip")
  })
  Address billingAddress;
}

@EmbeddedId Anotasyonu- Composite Key
Eğer istenirse Embeddable , Composite Key olarak kullanılabilir. Şöyle yaparız.
@Embeddable
public class CourseId {
  private String club_id;
  private String course_id;
}

@Entity
@Table(name="course_info")
public class Course {
  @EmbeddedId
  private CourseId migCourseId;

  ...
}
İç İçe @Embeddable
Şöyle yaparız. İlk Embeddable tanımlanır
@Embeddable
public class CourseId {
    private String club_id;
    private String course_id;
}
Bunu kullanan ikinci Embeddable tanımlanır.
@Embeddable
public class HoleId {
    private CourseId migCourseId;
    private int hole_num;
}
İkinci Embeddable composite key bile yapılabilir.
@Entity
@Table(name="hole_info")
public class Hole {
  @EmbeddedId
  private HoleId migHoleId;
  ...
}






Hiç yorum yok:

Yorum Gönder