29 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.

Bu anotason ile @AttributeOverrides anotasyonu bolca beraber kullanı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;
}
Embeddable İçinde @Entity Kullanımı
JPA desteklemiyor. Ben Hibernate ile denediğimde çalışmadı. Ancak başka provider ile çalıştışğı yazıyor.

Kalıtım
Normalde JPA desteklemiyor. 

Örnek
Eğer sanırım yeni bir Hibernate sürümü kullanıyorsak. Şöyle yaparız. Benim kullandığım Hibernate ile çalışmadı.
@MappedSuperclass
@Embeddable
public class Foo {
  //  atributes...
}

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

@Entity  
@Table
public class None {

  // atributes...

  @Embedded
  private Bar bar;

}
İç İçe (Nested) @Embeddable

Örnek
Açıklaması şöyle. getter ve setter yoksa şöyle yaparız.
The problem is that the default access for entities is field, but for embedded objects the default access is property.
Şöyl yaparız.
@Embeddable
@Access(AccessType.FIELD)
public class Emb {
    String embField;
Şöyl yaparız.
@Embeddable
@Access(AccessType.FIELD)
public class Col {
    @Embedded
    private Emb emb;
Örnek
Şö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