ทำไม JPA ถึงมีคำอธิบายประกอบ @Transient


คำตอบ:


455

transientคีย์เวิร์ดของ Java ถูกใช้เพื่อแสดงว่าฟิลด์ไม่ถูกทำให้เป็นอนุกรมในขณะที่@Transientคำอธิบายประกอบของ JPA ใช้เพื่อระบุว่าฟิลด์นั้นไม่ควรถูกยืนยันในฐานข้อมูลนั่นคือซีแมนทิกส์นั้นแตกต่างกัน


3
ใช่ความหมายต่างกัน แต่ทำไม JPA จึงออกแบบวิธีนี้
Dilum Ranatunga

1
ไม่แน่ใจว่าฉันเข้าใจคุณ แต่ดูคำตอบของ "Pascal Thivent")
Jawher

30
สิ่งนี้มีประโยชน์เพราะคุณอาจไม่ต้องการจัดเก็บข้อมูลในฐานข้อมูล แต่คุณต้องการเก็บไว้ในระบบ JPA Chaching ที่ใช้การจัดลำดับสำหรับการจัดเก็บ / กู้คืนเอนทิตี
Kdeveloper

1
"JPA Caching system" ใดที่ใช้การจัดลำดับสำหรับการจัดเก็บ / กู้คืนเอนทิตี การนำ JPA ไปใช้นั้นสามารถแคชวัตถุได้ทุกวิธีที่พวกเขาต้องการ
DataNucleus

@ Jawher ที่นี่สำหรับ transient not presistant หมายถึงการไม่แสดงค่าใด ๆ หรือจะใส่ค่าเริ่มต้นสำหรับแอตทริบิวต์นั้น
Satish Sharma

115

เพราะพวกมันมีความหมายต่างกัน @Transientคำอธิบายประกอบบอกผู้ให้บริการ JPA จะไม่ยืนยันใด ๆ (ไม่ใช่transientแอตทริบิวต์) อีกอันหนึ่งบอกถึงเฟรมเวิร์กการทำให้เป็นอนุกรมเพื่อไม่ทำให้เป็นอันดับแอตทริบิวต์ คุณอาจต้องการ@Transientทรัพย์สินและยังคงเป็นอันดับ


ขอบคุณสำหรับคำตอบ Pascal ตามหมายเหตุจากความคิดเห็นของคุณ: "คุณอาจต้องการทรัพย์สิน @Transient และยังคงเป็นอนุกรม" (นั่นคือสิ่งที่ฉันกำลังมองหา) ฉันยังต้องการที่จะเพิ่มว่าตรงกันข้ามไม่เป็นความจริง หากตั้งค่าตัวแปรเป็นแบบชั่วคราวคุณจะไม่สามารถคงอยู่ได้
jfajunior

96

ดังที่คนอื่น ๆ ได้กล่าวไว้@Transientใช้เพื่อทำเครื่องหมายฟิลด์ซึ่งไม่ควรคงอยู่ ลองพิจารณาตัวอย่างสั้น ๆ นี้:

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);
    }
}

เมื่อคลาสนี้ถูกป้อนเข้าสู่ JPA มันจะยังคงอยู่genderและidแต่ไม่พยายามที่จะยืนยันวิธีการบูลีนของผู้ช่วย - หากไม่มี@Transientระบบพื้นฐานจะบ่นว่าคลาสเอนทิตีPersonหายไปsetMale()และsetFemale()วิธีการPersonต่างๆ


@psp คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับสาเหตุ / วิธีการที่อาจทำให้เกิดพฤติกรรมที่ไม่ระบุหรือไม่ ขอบคุณ!
taiduckman

@ 40Plot ระบุข้อกำหนดดังนั้น
psp

7
นี้ควรจะเป็น IMHO คำตอบที่ได้รับการยอมรับในขณะที่มันมากขึ้นอธิบายว่าในปัจจุบันได้รับการยอมรับอย่างใดอย่างหนึ่ง ...
Honza Zidek

53

จุดประสงค์ที่แตกต่าง:

transientหลักและ@Transientคำอธิบายประกอบมีสองวัตถุประสงค์ที่แตกต่าง: หนึ่งในข้อตกลงกับอนุกรมและเป็นหนึ่งในข้อเสนอที่มีความคงทน ในฐานะโปรแกรมเมอร์เรามักจะแต่งงานกับแนวคิดทั้งสองนี้เป็นแนวคิดเดียว แต่สิ่งนี้ไม่ถูกต้องโดยทั่วไป ความคงทนหมายถึงลักษณะของรัฐที่มีอยู่มากกว่ากระบวนการที่สร้างขึ้น การทำให้เป็นอันดับใน Java หมายถึงกระบวนการของการเข้ารหัส / ถอดรหัสสถานะของวัตถุเป็นกระแสข้อมูลไบต์

transientคำหลักเป็นภาวะที่แข็งแกร่งกว่า@Transient:

ถ้าเขตข้อมูลใช้transientคำสำคัญเขตข้อมูลนั้นจะไม่ถูกทำให้เป็นอนุกรมเมื่อวัตถุถูกแปลงเป็นสตรีมไบต์ นอกจากนี้เนื่องจาก JPA ปฏิบัติต่อฟิลด์ที่มีเครื่องหมายtransientคำหลักว่ามี@Transientคำอธิบายประกอบ JPA จะไม่คงฟิลด์ดังกล่าว

ในทางตรงกันข้ามฟิลด์ที่มีคำอธิบายประกอบ@Transientเพียงอย่างเดียวจะถูกแปลงเป็นสตรีมไบต์เมื่อวัตถุได้รับการทำให้เป็นอนุกรม แต่ JPA จะไม่ถูกยืนยัน ดังนั้นtransientคำหลักเป็นเงื่อนไขที่แข็งแกร่งกว่า@Transientคำอธิบายประกอบ

ตัวอย่าง

นี่เป็นคำถาม: ทำไมทุกคนต้องการทำให้เป็นอันดับเขตข้อมูลที่ไม่ได้ยืนยันไปยังฐานข้อมูลของแอปพลิเคชัน ความจริงก็คืออนุกรมจะใช้สำหรับการมากกว่าเพียงแค่การติดตา ในแอปพลิเคชัน Enterprise Java จะต้องมีกลไกในการแลกเปลี่ยนวัตถุระหว่างส่วนประกอบแบบกระจาย ; การทำให้เป็นอนุกรมมีโปรโตคอลการสื่อสารทั่วไปเพื่อจัดการสิ่งนี้ ดังนั้นฟิลด์อาจเก็บข้อมูลที่สำคัญเพื่อวัตถุประสงค์ในการสื่อสารระหว่างองค์ประกอบ; แต่ฟิลด์นั้นอาจไม่มีค่าจากมุมมองการติดตา

ตัวอย่างเช่นสมมติว่าอัลกอริธึมการปรับให้เหมาะสมทำงานบนเซิร์ฟเวอร์และสมมติว่าอัลกอริทึมนี้ใช้เวลาหลายชั่วโมงจึงจะเสร็จสมบูรณ์ สำหรับลูกค้าการมีชุดโซลูชั่นที่ทันสมัยที่สุดเป็นสิ่งสำคัญ ดังนั้นลูกค้าสามารถสมัครสมาชิกเซิร์ฟเวอร์และรับการปรับปรุงเป็นระยะในระหว่างขั้นตอนการดำเนินการของอัลกอริทึม การปรับปรุงเหล่านี้มีให้โดยใช้ProgressReportวัตถุ:

@Entity
public class ProgressReport implements Serializable{

    private static final long serialVersionUID = 1L;

    @Transient
    long estimatedMinutesRemaining;
    String statusMessage;
    Solution currentBestSolution;

}

Solutionชั้นอาจมีลักษณะเช่นนี้

@Entity
public class Solution implements Serializable{

    private static final long serialVersionUID = 1L;

    double[][] dataArray;
    Properties properties;
}

เซิร์ฟเวอร์ยังคงมีอยู่แต่ละProgressReportฐานข้อมูล เซิร์ฟเวอร์ไม่สนใจที่จะคงอยู่estimatedMinutesRemainingแต่ลูกค้าจะใส่ใจกับข้อมูลนี้อย่างแน่นอน ดังนั้นการจะอธิบายโดยใช้estimatedMinutesRemaining @Transientเมื่อสุดท้ายSolutionจะตั้งอยู่ตามขั้นตอนวิธีการก็จะยังคงอยู่โดย JPA ProgressReportโดยตรงโดยไม่ต้องใช้


1
หากพวกเขามีความกังวลที่แตกต่างกันแน่นอนมีคำที่แตกต่างกันที่จับความแตกต่าง ทำไมเกินคำ @Unpersistedในฐานะที่เป็นข้อเสนอแนะของผู้ริเริ่ม
Dilum Ranatunga

4
@Ephemeralผมเองชอบ อ้างอิงจาก Merriam Webster: เมื่อ ephemeral ถูกตีพิมพ์ครั้งแรกในภาษาอังกฤษในปี 1600 "มันเป็นศัพท์ทางวิทยาศาสตร์ที่ใช้กับไข้ระยะสั้นและต่อมากับสิ่งมีชีวิต (เช่นแมลงและดอกไม้) ที่มีช่วงชีวิตสั้นมากไม่นานหลังจากนั้น มันได้รับความหมายเพิ่มเติมจากสิ่งที่หายไปและอายุสั้น (เช่น "ความพึงพอใจชั่วคราว")
Austin D

1
สิ่งที่ฉันชอบเกี่ยวกับคำตอบนี้ก็คือมันระบุว่า JPA พิจารณาtransientฟิลด์ว่ามี@Transientคำอธิบายประกอบโดยปริยาย ดังนั้นหากคุณใช้transientคีย์เวิร์ดเพื่อป้องกันการซีเรียลไลซ์เซชั่นของเขตข้อมูลมันจะไม่สิ้นสุดในฐานข้อมูลเช่นกัน
neXus

17

ถ้าคุณเพียงต้องการข้อมูลจะไม่ได้รับการยืนยันทั้งชั่วคราวและ@Transientทำงาน แต่คำถามคือทำไม@Transientเนื่องจากมีอยู่ชั่วคราว

เนื่องจากฟิลด์ @Transient จะยังคงรับต่อเนื่อง!

สมมติว่าคุณสร้างเอนทิตีโดยใช้การคำนวณที่ใช้ CPU เพื่อรับผลลัพธ์และผลลัพธ์นี้จะไม่บันทึกในฐานข้อมูล แต่คุณต้องการที่จะส่งนิติบุคคลเพื่อการใช้งาน Java อื่น ๆ ที่จะใช้โดย JMS แล้วคุณควรใช้@Transientไม่ JavaSE transientคำหลัก ดังนั้นตัวรับสัญญาณที่รันบน VMs อื่นสามารถประหยัดเวลาในการคำนวณอีกครั้ง


คุณช่วยยกตัวอย่างให้ชัดเจนขึ้นได้ไหม
Harsh Kanakhara

จะมีคำอธิบายประกอบที่ jpa จะถือว่าเป็นชั่วคราว แต่แจ็คสันจะไม่?
Kalpesh Soni

0

ฉันจะพยายามตอบคำถาม "ทำไม" ลองนึกภาพสถานการณ์ที่คุณมีฐานข้อมูลขนาดใหญ่ที่มีคอลัมน์จำนวนมากในตารางและโครงการ / ระบบของคุณใช้เครื่องมือเพื่อสร้างเอนทิตีจากฐานข้อมูล (ไฮเบอร์เนตมีสิ่งเหล่านั้น ฯลฯ ) ตอนนี้สมมติว่าด้วยตรรกะทางธุรกิจของคุณคุณต้องมีฟิลด์เฉพาะที่ไม่ต้องยืนยัน คุณต้อง "กำหนดค่า" เอนทิตีของคุณด้วยวิธีเฉพาะ ขณะที่คีย์เวิร์ด Transient ทำงานบนอ็อบเจ็กต์ - เนื่องจากทำงานภายในภาษาจาวาแต่ทว่า @Transient ออกแบบมาเพื่อตอบภารกิจที่เกี่ยวข้องกับภารกิจการคงอยู่เท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.