Java มีtransient
คำหลัก เพราะเหตุใด JPA จึงมี@Transient
แทนที่จะใช้คำหลัก java ที่มีอยู่แล้ว
Java มีtransient
คำหลัก เพราะเหตุใด JPA จึงมี@Transient
แทนที่จะใช้คำหลัก java ที่มีอยู่แล้ว
คำตอบ:
transient
คีย์เวิร์ดของ Java ถูกใช้เพื่อแสดงว่าฟิลด์ไม่ถูกทำให้เป็นอนุกรมในขณะที่@Transient
คำอธิบายประกอบของ JPA ใช้เพื่อระบุว่าฟิลด์นั้นไม่ควรถูกยืนยันในฐานข้อมูลนั่นคือซีแมนทิกส์นั้นแตกต่างกัน
เพราะพวกมันมีความหมายต่างกัน @Transient
คำอธิบายประกอบบอกผู้ให้บริการ JPA จะไม่ยืนยันใด ๆ (ไม่ใช่transient
แอตทริบิวต์) อีกอันหนึ่งบอกถึงเฟรมเวิร์กการทำให้เป็นอนุกรมเพื่อไม่ทำให้เป็นอันดับแอตทริบิวต์ คุณอาจต้องการ@Transient
ทรัพย์สินและยังคงเป็นอันดับ
ดังที่คนอื่น ๆ ได้กล่าวไว้@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
ต่างๆ
จุดประสงค์ที่แตกต่าง:
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
โดยตรงโดยไม่ต้องใช้
@Unpersisted
ในฐานะที่เป็นข้อเสนอแนะของผู้ริเริ่ม
@Ephemeral
ผมเองชอบ อ้างอิงจาก Merriam Webster: เมื่อ ephemeral ถูกตีพิมพ์ครั้งแรกในภาษาอังกฤษในปี 1600 "มันเป็นศัพท์ทางวิทยาศาสตร์ที่ใช้กับไข้ระยะสั้นและต่อมากับสิ่งมีชีวิต (เช่นแมลงและดอกไม้) ที่มีช่วงชีวิตสั้นมากไม่นานหลังจากนั้น มันได้รับความหมายเพิ่มเติมจากสิ่งที่หายไปและอายุสั้น (เช่น "ความพึงพอใจชั่วคราว")
transient
ฟิลด์ว่ามี@Transient
คำอธิบายประกอบโดยปริยาย ดังนั้นหากคุณใช้transient
คีย์เวิร์ดเพื่อป้องกันการซีเรียลไลซ์เซชั่นของเขตข้อมูลมันจะไม่สิ้นสุดในฐานข้อมูลเช่นกัน
ถ้าคุณเพียงต้องการข้อมูลจะไม่ได้รับการยืนยันทั้งชั่วคราวและ@Transientทำงาน แต่คำถามคือทำไม@Transientเนื่องจากมีอยู่ชั่วคราว
เนื่องจากฟิลด์ @Transient จะยังคงรับต่อเนื่อง!
สมมติว่าคุณสร้างเอนทิตีโดยใช้การคำนวณที่ใช้ CPU เพื่อรับผลลัพธ์และผลลัพธ์นี้จะไม่บันทึกในฐานข้อมูล แต่คุณต้องการที่จะส่งนิติบุคคลเพื่อการใช้งาน Java อื่น ๆ ที่จะใช้โดย JMS แล้วคุณควรใช้@Transient
ไม่ JavaSE transient
คำหลัก ดังนั้นตัวรับสัญญาณที่รันบน VMs อื่นสามารถประหยัดเวลาในการคำนวณอีกครั้ง
ฉันจะพยายามตอบคำถาม "ทำไม" ลองนึกภาพสถานการณ์ที่คุณมีฐานข้อมูลขนาดใหญ่ที่มีคอลัมน์จำนวนมากในตารางและโครงการ / ระบบของคุณใช้เครื่องมือเพื่อสร้างเอนทิตีจากฐานข้อมูล (ไฮเบอร์เนตมีสิ่งเหล่านั้น ฯลฯ ) ตอนนี้สมมติว่าด้วยตรรกะทางธุรกิจของคุณคุณต้องมีฟิลด์เฉพาะที่ไม่ต้องยืนยัน คุณต้อง "กำหนดค่า" เอนทิตีของคุณด้วยวิธีเฉพาะ ขณะที่คีย์เวิร์ด Transient ทำงานบนอ็อบเจ็กต์ - เนื่องจากทำงานภายในภาษาจาวาแต่ทว่า @Transient ออกแบบมาเพื่อตอบภารกิจที่เกี่ยวข้องกับภารกิจการคงอยู่เท่านั้น