28 Haziran 2018 Perşembe

JPA @IdClass Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.persistence.Id;
Sınıfın @Id ile işaretli birden fazla alanı varsa yani composite primary key varsa kullanılabilir.

Composite primary key tanımlamak için 3 yöntem var. İlk yöntem en kolayı.
1. Mark it as @Embeddable and add to your entity class a normal property for it, marked with @Id.
2. Add to your entity class a normal property for it, marked with @EmbeddedId.
3. Add properties to your entity class for all of its fields, mark them with @Id,and mark your entity class with @IdClass, supplying the class of your primary key class.
PrimaryKey olarak tanımlanan yeni sınıf şu özelliklere sahip olmalı. En önemlisi Serializable olması ve equals() + hashCode() metodlarını gerçekleştirmesi
- It is a POJO class.
- It is a public class with a public no-argument constructor.
- If you use property-based access, the properties of the primary key class are public or protected.
- It is serializable.
- It defines equals and hashCode methods. The semantics of value equality for these methods must be consistent with the database equality for the database types to which the key is mapped.
- Its fields or properties must correspond in type and name to the entity primary key fields or properties annotated with @Id.
- An instance of the IdClass is used with the EntityManager find() operation, to find an entity by its id.
Örnek
Şöyle yaparız.
public class SamplesKey implements Serializable {

  private Integer id;
  private int year;
  ...
}

@Entity
@IdClass(EmbedddedSamplesKey.class)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Samplings {

  @Id
  @GeneratedValue
  private Integer id;

  @Id
  private int year;
  ...
}
Örnek
Şöyle bir tablomuz olsun.
detail
  primary key (master_id, name)  name string
  ...
Sınıfımızın PK anlarını göz önüne alarak şöyle kodlarız.
@Entity
@Table(name = "detail")
@IdClass(DetailIdPk.class)
class Detail {
  @Id
  int master;

  @Id
  String name;
}
@IdClass olarak belirtilmiş sınıfımızı şöyle kodlarız.
class DetailIdPK implements Serializable {

  int master;

  String name;

}

Hiç yorum yok:

Yorum Gönder