Enum Eşleme — Bloklu Kart Neden Bir Gün Dondurulmuş Göründü?
Önce şunu oku: Flush ve SQL Sırası — save() Satırında Neden Hiçbir Şey Olmuyor?
30 saniyede özet
JPA varsayılan olarak enum'un sıra numarasını yazar. Araya bir değer eklenince eski satırlar sessizce başka bir durumla okunur. İsimle yazmak eklemeye, sabit kodlu bir AttributeConverter ise yeniden adlandırmaya da dayanır.
Bir dolabın çekmeceleri yalnızca numarayla biliniyor: “bloklu kartlar ikinci çekmecede.” Biri araya yeni bir çekmece takınca, ikinci çekmece artık başka bir şeyin çekmecesidir. İçindeki kartlar aynı, ama adresleri kaydı.
-
Bayt: Kart durumuna yeni bir değer ekledim: FROZEN. Hepsi bu.
-
Sen: Testler geçti, yayına aldık. Şimdi müşteri hizmetleri arıyor.
-
Bayt: Bloklu kartlar dondurulmuş görünüyor, kapalı kart da bloklu! Veritabanına kimse dokunmadı.
-
Bayt: Veri aynı. Değişen, o sayıların ne anlama geldiği.
Sütunda aslında ne yazıyor?
Bir enum alanına @Enumerated yazıp tür vermezsen, JPA sütuna değerin adını değil, ordinalBir enum sabitinin listedeki sıfırdan başlayan sırası. İlk sabitin ordinal değeri 0'dır.Liste değişince değişir; bu yüzden kalıcı bir kimlik olarak (veritabanında, dosyada) kullanılmaz. Kalıcı olan sabitin adıdır: name().Sözlükte gör → yazar. ACTIVE 0, BLOCKED 1, CLOSED 2 olur.
Sütunda yalnızca sayılar durur. O sayının hangi duruma karşılık geldiğini veritabanı değil, o anki Java kodun bilir.
Kafam karıştı, daha basit anlat
Varsayılan ayarda sütunda ad değil, sıra numarası durur. Anlamı kod belirler.
Bir enum alanına @Enumerated yazılıp tür verilmezse veritabanına ne yazılır?
Enum'da ACTIVE, BLOCKED, CLOSED var ve ORDINAL kullanılıyor. BLOCKED bir kart için sütunda ne yazar?
Araya bir değer, ve sonra bir yeniden adlandırma
Sütunda sıra numaraları duruyor. Enum'da ACTIVE ile BLOCKED arasına FROZEN eklendi. Daha önce BLOCKED diye yazılmış kart şimdi nasıl okunur? Cevabı göster
FROZEN olarak, hiçbir hata vermeden. Sütunda 1 yazıyor ve yeni kodda 1, FROZEN’ın sırası. CLOSED kart da BLOCKED okunur; çünkü 2 artık BLOCKED.
Adım adım oku
- Çekmeceler sadece numarayla biliniyor.
- Biri araya yeni bir çekmece ekledi.
- İki numara artık başka bir çekmece.
- Çekmeceye numara değil, sabit bir etiket.
EnumType.STRING sütuna adı yazar; araya değer eklemek artık güvenlidir. Ama BLOCKED’ı SUSPENDED diye yeniden adlandırırsan, sütundaki “BLOCKED” yeni kodda yoktur ve okuma hata verir.
Bir AttributeConverterBir Java değerini sütuna nasıl yazılacağını ve geri nasıl okunacağını belirleyen JPA arayüzü. Enum'a sabit bir kod vermek için kullanılır.Sözlükte gör → her değere senin seçtiğin sabit bir kod verir: ACTIVE için ‘A’, BLOCKED için ‘B’. Ad da sıra da değişse sütundaki kod aynı kalır.
Kafam karıştı, daha basit anlat
Sıra numarası eklemede kayar, ad yeniden adlandırmada kırılır. Sabit kod ikisine de dayanır.
ORDINAL kullanılırken ACTIVE ile BLOCKED arasına FROZEN eklendi. Eski BLOCKED kartlar nasıl okunur?
EnumType.STRING neyi çözer?
Kendin gör
Kart durumu, yeni sürümde
Tohum 96571- Kart 1: ACTIVE yazıldı
- Kart 2: BLOCKED yazıldı
- Kart 3: CLOSED yazıldı
- Kart 4: BLOCKED yazıldı
✕ sessizce yanlış: 0 · ⚠ okunamadı: 0
Şu an ne oldu?
@Enumerated varsayılanı (ORDINAL, sıra numarası) · ACTIVE ile BLOCKED arasına FROZEN eklendi
Satırlar eski sürümle yazıldı; yeni sürüm onları tek tek okuyor.
Görevler0/3
Hiç hata olmadan kartlar yanlış durumla okunsunaçık
İpucu
Sıra numarası ve araya ekleme.
Okuma yüksek sesle hata versinaçık
İpucu
İsimle yaz, sonra yeniden adlandır.
Yeniden adlandırmadan sonra bile her kart doğru okunsunaçık
İpucu
Sabit kod.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Sıra numarası ve araya ekleme: dört karttan üçü, hiç hata olmadan yanlış durumla okundu.
- “İsim” ve “yeniden adlandırıldı” seç. İki bloklu kart okunamadı; hata yüksek sesli.
- “Sabit kod” ve “yeniden adlandırıldı” seç. Bütün kartlar doğru okundu.
EnumType.STRING kullanılırken BLOCKED, SUSPENDED diye yeniden adlandırıldı. Eski satırlar okunurken ne olur?
AttributeConverter ile enum'a sabit bir kod vermenin kazancı nedir?
Tuzaklar
Yalnızca kodu değiştirmek. Yıllardır sıra numarasıyla yazılmış bir tabloda türü STRING yapmak yetmez; eski 0, 1, 2 değerleri ad olarak okunamaz. Veriyi bir şema göçüVeritabanı yapısını ya da içindeki veriyi sürümlü bir betikle değiştirmek. Flyway ve Liquibase bunu her ortamda aynı sırayla çalıştırır.Sözlükte gör → ile taşı, kodu onunla birlikte değiştir.
Aynı kodu iki değere vermek. Converter’da iki değer aynı kodu alırsa biri diğeri gibi okunur. Kodların benzersiz olduğunu küçük bir testle doğrula.
Kullanılan bir değeri silmek. Tabloda o değerde satır varken enum’dan silmek, o satırları okunamaz yapar. Önce satırları taşı ya da değeri “kullanımdan kalktı” diye tut.
Kafam karıştı, daha basit anlat
Saklama biçimi değişirse veriyi de taşı, kodları benzersiz tut, kullanılan değeri silme.
Converter kullanılıyor ve iki farklı enum değerine yanlışlıkla aynı kod verildi. Ne olur?
Derinleş · Kart durumu: sabit kodlu enum ve converter 5 dosya · ~93 satır · ilk okumada atlayabilirsin
Kendini sına
Tür verilmeyen @Enumerated sütuna değerin adını yazar.
Tablo yıllardır ORDINAL ile yazılmış. STRING'e geçmek için en güvenli yol hangisi?
Aklında kalacak üç şey
- 1 Tür verilmeyen @Enumerated, sütuna değerin sıra numarasını yazar. Enum'a araya bir değer eklemek eski satırların anlamını hatasız değiştirir.
- 2 EnumType.STRING araya eklemeye dayanıklıdır, ama bir değeri yeniden adlandırmak eski satırları okunamaz yapar.
- 3 Sabit kodlu bir AttributeConverter, sütundaki değeri koddaki addan ve sıradan bağımsız tutar.
4 kart sonraki derste seni bekliyor