JPA'nın neden @ Geçici bir ek açıklaması var?


Yanıtlar:


455

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.


3
Evet, anlambilim farklıdır. Ama JPA neden bu şekilde tasarlandı?
Dilum Ranatunga

1
Seni anladığımdan emin değilim, ama "Pascal Thivent" in cevabına bir göz at;)
Jawher

30
Bu, verileri veritabanında saklamak istemeyebileceğiniz, ancak varlıkları saklamak / geri yüklemek için serileştirmeyi kullanan JPA Chaching sisteminde saklamak istediğiniz için kullanışlıdır.
Kdeveloper

1
Varlıkların depolanması / geri yüklenmesi için serileştirmeyi kullanan "JPA Önbellek sistemi" nedir? JPA uygulaması bir nesneyi istedikleri şekilde önbelleğe alabilir ve serileştirme ona girmez.
DataNucleus

@Jawher, burada geçici olmayan başkan için herhangi bir değere dayanmamak anlamına gelir veya bu özellik için varsayılan değer ekler.
Satish Sharma

115

Çü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 .


Cevabınız için teşekkürler Pascal. Yorumunuzdan bir not olarak: "@Transient özelliğine sahip olabilir ve yine de serileştirebilirsiniz." (Aradığım da buydu) Ayrıca, bunun tersinin doğru olmadığını da eklemek istiyorum. Biri bir değişkeni geçici olarak ayarlarsa, onu değiştiremezsiniz.
jfajunior

96

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ç.


@psp neden / nasıl belirtilmemiş davranışa neden olabileceği hakkında daha fazla bilgi verebilir misiniz? Teşekkürler!
taiduckman

Şartname durumlarını buna göre çizin
psp

7
Bu kabul edilen cevap IMHO olmalıdır, çünkü mevcut kabul edilen bir çok daha açıklıyor ...
Honza Zidek

53

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.


1
Aslında farklı endişeler varsa, nüansları yakalayan farklı bir kelime vardır. Terim neden aşırı? Başlangıç ​​önerisi olarak @Unpersisted,.
Dilum Ranatunga

4
Şahsen seviyorum @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. "
Austin D

1
Bu cevap hakkında da sevdiğim şey, JPA'nın 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.
neXus

17

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.


daha açık hale getirmek için lütfen örnek verebilir misiniz?
Sert Kanakhara

jpa'nın geçici olarak ele alacağı, ancak jackson'un işlemeyeceği bir ek açıklama var mı?
Kalpesh Soni

0

"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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.