Yanıtlar:
Java'nın transient
anahtar sözcüğü, bir alanın serileştirilmeyeceğini @Transient
belirtmek için kullanılırken , JPA'nın ek açıklaması, bir alanın veritabanında kalıcı olmayacağını, yani semantiklerinin farklı olduğunu belirtmek için kullanılır.
Çünkü farklı anlamları var. @Transient
Ek açıklama herhangi biri (non ısrar etmemeyi JPA sağlayıcı söyler transient
) özelliğini. Diğeri serileştirme çerçevesine bir niteliği serileştirmemesini söyler. Bir @Transient
özelliğinizin olup hala serileştirilmesini isteyebilirsiniz .
Diğerlerinin söylediği gibi, @Transient
kalıcı olmaması gereken alanları işaretlemek için kullanılır. Bu kısa örneği ele alalım:
public enum Gender { MALE, FEMALE, UNKNOWN }
@Entity
public Person {
private Gender g;
private long id;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public Gender getGender() { return g; }
public void setGender(Gender g) { this.g = g; }
@Transient
public boolean isMale() {
return Gender.MALE.equals(g);
}
@Transient
public boolean isFemale() {
return Gender.FEMALE.equals(g);
}
}
Bu sınıf JPA beslenir, bu devam ederse gender
ve id
fakat yardımcı boole yöntemleri devam çalışmaz - olmadan @Transient
Varlık sınıfı şikayet ediyorum yatan sistemin Person
eksik setMale()
ve setFemale()
devam eder ve dolayısıyla yöntemleri ve Person
hiç.
Amaç farklı:
transient
Anahtar kelime ve @Transient
bir kez fiyatlarını: ek açıklama iki farklı amaçlara sahip serileştirme ve bir kez fiyatlarını kalıcılık . Programcılar olarak, genellikle bu iki kavramı bir araya getiririz, ancak bu genel olarak doğru değildir. Kalıcılık , onu yaratan süreci geride bırakan devletin özelliğini ifade eder. serileştirmeJava'da , bir nesnenin durumunu bir bayt akışı olarak kodlama / kod çözme işlemini ifade eder.
transient
Anahtar kelime daha güçlü bir durumdur @Transient
:
Alan transient
anahtar kelimeyi kullanırsa, nesne bir bayt akışına dönüştürüldüğünde o alan serileştirilmez. Ayrıca, JPA transient
anahtar kelimeyle işaretlenen alanlara @Transient
ek açıklama olarak baktığından, alan JPA tarafından da kalıcı olmayacaktır.
Öte yandan, açıklamalı alanlar @Transient
yalnız edecek nesne seri bir bayt akışı dönüştürülebilir, ancak JPA tarafından kalıcı olmayacaktır. Bu nedenle, transient
anahtar kelime @Transient
ek açıklamadan daha güçlü bir durumdur .
Misal
Bu şu soruyu sorar: Neden kimse uygulamanın veritabanında kalıcı olmayan bir alanı serileştirmek istesin ki? Gerçek şu ki, serileştirme sadece kalıcılıktan daha fazlası için kullanılıyor . Enterprise Java uygulamasında dağıtılmış bileşenler arasında nesne alışverişi için bir mekanizma olması gerekir ; Serileştirme, bunun üstesinden gelmek için ortak bir iletişim protokolü sağlar. Böylece, bir alan, bileşenler arası iletişim amacıyla kritik bilgileri tutabilir; ancak aynı alanın kalıcılık perspektifinden bir değeri olmayabilir.
Örneğin, bir optimizasyon algoritmasının bir sunucuda çalıştırıldığını ve bu algoritmanın tamamlanmasının birkaç saat sürdüğünü varsayalım. Bir müşteri için, en güncel çözümlere sahip olmak önemlidir. Böylece, bir istemci sunucuya abone olabilir ve algoritmanın yürütme aşamasında periyodik güncellemeler alabilir. Bu güncellemeler ProgressReport
nesne kullanılarak sağlanır :
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
Solution
Sınıf aşağıdaki gibi görünebilir:
@Entity
public class Solution implements Serializable{
private static final long serialVersionUID = 1L;
double[][] dataArray;
Properties properties;
}
Sunucu her ProgressReport
birini kendi veritabanında saklar. Sunucu devam etmeyi umursamıyor estimatedMinutesRemaining
, ancak istemci bu bilgileri kesinlikle önemsiyor. Bu nedenle, estimatedMinutesRemaining
kullanılarak açıklama eklenir @Transient
. Final Solution
algoritma tarafından bulunduğunda, JPA tarafından a kullanılmadan doğrudan devam ettirilir ProgressReport
.
@Unpersisted
,.
@Ephemeral
. Merriam Webster'e göre: Geçici ilk kez 1600'lerde İngilizce olarak basıldığında, "kısa süreli ateşlere ve daha sonra çok kısa ömürlü organizmalara (böcekler ve çiçekler gibi) uygulanan bilimsel bir terimdi. , geçici ve kısa ömürlü her şeye ("geçici zevkler" de olduğu gibi) atıfta bulunarak geniş bir anlam kazanmıştır. "
transient
alanları dolaylı olarak @Transient
ek açıklamaya sahip olarak gördüğünü belirtmesidir . Eğer transient
bir alanın serileştirilmesini önlemek için anahtar kelimeyi kullanırsanız, o zaman veritabanında da sona ermeyecektir.
Sadece istiyorsanız bir saha, hem kalıcı almazsınız geçici ve @Transient işi. Ama soru şu ki, geçici olduğundan beri @Transient zaten var.
Çünkü @ Geçiş alanı hala serileştirilecek!
Bir varlık oluşturduğunuzu ve sonuç almak için CPU tüketen hesaplamalar yaptığınızı varsayalım ve bu sonuç veritabanına kaydedilmez. Ancak varlığı JMS tarafından kullanılacak diğer Java uygulamalarına göndermek istiyorsunuz, o zaman @Transient
JavaSE anahtar sözcüğünü değil, kullanmalısınız transient
. Böylece diğer VM'lerde çalışan alıcılar yeniden hesaplamak için zaman kazanabilirler.
"Neden" sorusunu cevaplamaya çalışacağım. Tabloda çok sayıda sütun içeren büyük bir veritabanınız olduğu ve projeniz / sisteminizin veritabanından varlık oluşturmak için araçlar kullandığını düşünün. (Hazırda Beklet vb. Vardır.) Şimdi, iş mantığınızla kalıcı olmamak için belirli bir alana ihtiyacınız olduğunu varsayın. Varlığınızı belirli bir şekilde "yapılandırmanız" gerekir. Transient anahtar sözcüğü bir nesne üzerinde çalışırken - bir java dilinde çalıştığından, @Transient yalnızca kalıcılık görevleriyle ilgili görevleri yanıtlamak için tasarlanmıştır.