Harita listesi

İlkel veri türlerinin nasıl eşleneceğini zaten bulduk: @Column ek açıklamasını ve @Type ek açıklamasını kullanıyoruz . Ancak tüm vakalar bu ek açıklamalar kapsamında olmayabilir. Ve en yaygın durum enum'dur .

Java enum nesneleri veritabanında iki şekilde saklanabilir:

  • sayı olarak
  • dizi olarak

Kullanıcının enum kullanılarak ayarlanan favori bir renge sahip olacağı küçük bir örnek yazalım.


enum Color {
   RED,
   ORANGE,
   YELLOW,
   GREEN,
   BLUE,
   VIOLET
}

Ve User sınıfına bir renk alanı ekleyin :


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Column(name="favorite_color")
   public Color favoriteColor;
 
   @Column(name="created_date")
   public Date createdDate;
}

Hibernate'in Color tipini sayı olarak tabana kaydetmesini istiyorsak , o zaman alana ihtiyacımız var.favori renknot ekle:


@Enumerated(EnumType.ORDINAL)

Değerlerin string olarak saklanmasını istiyorsak , o zaman bir ek açıklama eklememiz gerekir:


@Enumerated(EnumType.STRING)

Örnek:


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Enumerated(EnumType.ORDINAL) //value will be saved to the base as a number
   @Column(name="favorite_color")
   public Color favoriteColor;
 
   @Column(name="created_date")
   public Date createdDate;
}

Mapim Boolean

İkinci faydalı senaryo, boole tipi eşlemedir. Tarihsel olarak öyle oldu ki, SQL'in Boolean için kendi veri türü yok ve bunun yerine orada herhangi bir şey kullanılıyor.

En yaygın üç seçenek şunlardır:

  • 1 veya 0
  • 'Kale'
  • 'Y' veya 'N'

Genel olarak, üssünüzü tasarlayacaksanız, BIT türünü hemen yazmak daha iyidir. Bunun için tam eşleme şöyle görünecek:


	@Column(name = "is_correct", columnDefinition = "BIT")
	@Type(type = "org.hibernate.type.NumericBooleanType")
    private Boolean isCorrect;

Pekala, veritabanını tasarlamıyorsanız, yukarıdaki tabloya bakın ve ihtiyacınız olan türleri nasıl doğru bir şekilde haritalayacağınızı düşünün.

Hesaplanan alanlar

Bazen Entity sınıfındaki alan sayısı ile tablodaki sütun sayısı eşleşmez. Bunun birkaç nedeni olabilir.

En yaygın olanı, Entity sınıfımızda veritabanına kaydetmek istemediğimiz bir alan olduğu zamandır. Bununla her şey açık - böyle bir alana sadece @Transient ek açıklamasını ekleyin ve Hazırda Bekletme, veritabanıyla çalışırken bunu yok sayacaktır.

Örnek:


@Entity(name = "Square")
public class Square {
           	@Id
           	public Long id;
 
           	public Integer width;
 
           	public Integer height;
 
           	@Transient
           	public Integer total;
}

Bu iyi bir seçenektir, ancak veritabanından bir nesne okunurken toplam alan boş olacaktır. Ve genişlik*yükseklik çarpımını içermesini istiyoruz. Bu, Hazırda Bekletme modunda da yapılabilir. Bunun için özel bir @Formula ek açıklaması var .


@Entity(name = "Square")
public class Square {
           	@Id
           	public Long id;
 
           	public Integer width;
 
           	public Integer height;
 
           	@Formula(value = " width * height ")
          	public Integer total;
}

Böyle bir alan veri tabanına kaydedilmeyecek ve nesne veri tabanından okunduğunda formülle hesaplanan değer ona yazılacaktır.

SQL sorgusu şöyle görünecektir:

 SELECT id, width, height, (width* height) AS total FROM Square;

@Gömülü

Bir başka yararlı not da @Embedded'dir . Alt nesnenin alanlarını Entity sınıfının alanları olarak görmenizi sağlar.

Diyelim ki bir User sınıfınız var ve ona bir adres eklemeye karar verdiniz:


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
    public Integer id;
 
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
 
   @Column(name="created_date")
    public Date createdDate;
}

Her şey yolunda görünüyor, ancak Java açısından adresi ayrı bir sınıfa koymak mantıklı olacaktır. Adres hala ayrı bir varlıktır. Ancak tüm bu bilgiler kullanıcı tablosundaki veritabanında saklanıyorsa bu nasıl yapılır?

@Embedded ek açıklaması bize yardımcı olacaktır . İlk olarak, UserAddress sınıfını oluşturacağız ve kullanıcının adresindeki tüm bilgileri içine koyacağız:


@Embeddable
class UserAddress
{
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
}

Sonra bu sınıfın bir alanını User sınıfımızda kullanırız :


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Embedded
   public UserAddress address;
 
   @Column(name="created_date")
   public Date createdDate;
}

@Embedded ek açıklaması sayesinde Hibernate, nesneyi kaydederken UserAddress sınıfının alanlarının User sınıfının alanları olarak ele alınması gerektiğini anlayacaktır .

Önemli! User sınıfınıza iki UserAddress alanı eklemeye karar verirseniz , @Embedded kullanmak artık çalışmaz: yinelenen alanlarınız olur ve bunları bir şekilde ayırmanız gerekir. Bu, açıklamaları geçersiz kılarak yapılır: @AttributeOverrides ek açıklaması kullanılarak .

Bunu bilmenizi isterim ama burada ayrıntılara girmeyeceğiz. Bence bu kafanı kırman için yeterli. Meraklısı için resmi belgelerin linkini bırakabilirim .