JPA Composite Primary Key Code Usage Example

@IdClass örneği: @Entity’ye ek @IdClass eklenmeli ve IdClass içerisinde yer alan sınıf aşağıdaki gibi Serializable, equals ve hashCode özellikleriyle birlikte tanımlanmalıdır. [code language=”java”] import javax.persistence.*; @Entity @IdClass(CatalogIdbPk.class) public class Catalog { @Id private int salesChannelCode; @Id private int materialGroupCode; private String materialGroup; @OneToMany(mappedBy = "catalog") private List<Product> productList; // get-set // … } import java.io.Serializable; public class CatalogIdbPk implements Serializable { private static final long serialVersionUID = 1L; private int salesChannelCode; private int materialGroupCode; // get-set // … @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + materialGroupCode; result = prime * result + salesChannelCode; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CatalogIdbPk other = (CatalogIdbPk) obj; if (materialGroupCode != other.materialGroupCode) return false; if (salesChannelCode != other.salesChannelCode) return false; return true; } } [/code] Veritabanından birleşik birincil anahtarlı olan bir nesne çekmek/getirmek için buradaki gibi bir sorgu hazırlamalısınız. @Embeddable örneği: @Entity’ye ek olarak bir tanımlama yapılmamaktadır. Java özelliğine(property) @EmbeddedId belirtimi(annotation) yazılmalıdır. [code language=”java”] import javax.persistence.*; @Entity public class Product { @EmbeddedId private ProductEmbPk productEmbPk; //get-set . . . } import java.io.Serializable; @Embeddable public class ProductEmdPk implements Serializable { private static final long serialVersionUID = 1L; private String productCode; private int productSubCode; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + productSubCode; result = prime * result + ((productCode == null) ? 0 : productCode.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ProductIdPk other = (ProductIdPk) obj; if (productSubCode != other.productSubCode) return false; if (productCode == null) { if (other.productCode != null) return false; } else if (!productCode.equals(other.productCode)) return false; return true; } } [/code] @IdClass ile daha farklı bir örnek: Farklı bir birincil anahtar tanımlaması örneği ise aşağıdaki gibidir. İlişkili bulunulan sınıfın birleşik birincil anahtarlarını da kendi birleşik birincil anahtar sınıfınızda kullanımı şekli. [code language=”java”] import javax.persistence.*; @Entity @IdClass(ProductIdPk.class) public class Product { @Id private String productCode; @ManyToOne @JoinColumns({ @JoinColumn(name="catalog_salesChannelCode", referencedColumnName = "salesChannelCode", insertable = false, updatable = false), @JoinColumn(name="catalog_materialGroupCode", referencedColumnName = "materialGroupCode", insertable = false, updatable = false) }) private Catalog catalog; // get-set // … } import java.io.Serializable; public class ProductIdPk implements Serializable { private static final long serialVersionUID = 1L; private String productCode; private int salesChannelCode; private int materialGroupCode; // get-set . . . @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + materialGroupCode; result = prime * result + ((productCode == null) ? 0 : productCode.hashCode()); result = prime * result + salesChannelCode; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ProductIdPk other = (ProductIdPk) obj; if (materialGroupCode != other.materialGroupCode) return false; if (productCode == null) { if (other.productCode != null) return false; } else if (!productCode.equals(other.productCode)) return false; if (salesChannelCode != other.salesChannelCode) return false; return true; } } [/code] Sınıf örneklerinin doldurulması işlemi ise aşağıdaki gibi yapılmalıdır. [code language=”java”] int salesChannelCode = 6; int materialGroupCode = 13; List<Product> productList = new ArrayList<>(); Product product = new Product(); product.setSalesChannelCode(salesChannelCode); product.setMaterialGroupCode(materialGroupCode); product.setProductCode("1"); product.setProductName("Keyboard"); productList.add(product); Catalog catalog = new Catalog(); catalog.setSalesChannelCode(salesChannelCode); catalog.setMaterialGroupCode(materialGroupCode); [/code] artık catalog örneğimizi(instance) veritabanına kaydedebiliriz. Veritabanına yazarken bağlantıları yukarıdaki gibi biz besliyoruz ancak veritabanından ilgili objeyi getirmek istediğimizde iki objenin arasındaki ilişkiye göre objeler gelecek, güncellenecek veya silinecektir. ]]>

Leave a Reply

Your email address will not be published. Required fields are marked *