Yanıtlar:
Java'nın transientanahtar sözcüğü, bir alanın serileştirilmeyeceğini @Transientbelirtmek 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. @TransientEk 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, @Transientkalı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 genderve idfakat yardımcı boole yöntemleri devam çalışmaz - olmadan @TransientVarlık sınıfı şikayet ediyorum yatan sistemin Personeksik setMale()ve setFemale()devam eder ve dolayısıyla yöntemleri ve Personhiç.
Amaç farklı:
transientAnahtar kelime ve @Transientbir 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.
transientAnahtar kelime daha güçlü bir durumdur @Transient:
Alan transientanahtar kelimeyi kullanırsa, nesne bir bayt akışına dönüştürüldüğünde o alan serileştirilmez. Ayrıca, JPA transientanahtar kelimeyle işaretlenen alanlara @Transientek açıklama olarak baktığından, alan JPA tarafından da kalıcı olmayacaktır.
Öte yandan, açıklamalı alanlar @Transientyalnız edecek nesne seri bir bayt akışı dönüştürülebilir, ancak JPA tarafından kalıcı olmayacaktır. Bu nedenle, transientanahtar kelime @Transientek 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 ProgressReportnesne kullanılarak sağlanır :
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
SolutionSı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 ProgressReportbirini kendi veritabanında saklar. Sunucu devam etmeyi umursamıyor estimatedMinutesRemaining, ancak istemci bu bilgileri kesinlikle önemsiyor. Bu nedenle, estimatedMinutesRemainingkullanılarak açıklama eklenir @Transient. Final Solutionalgoritma 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. "
transientalanları dolaylı olarak @Transientek açıklamaya sahip olarak gördüğünü belirtmesidir . Eğer transientbir 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 @TransientJavaSE 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.