ฉัน m มีปัญหาบางอย่างในการแมป array byte ไปยังฐานข้อมูล MySQL ใน Hibernate และสงสัยว่าถ้าฉันยังไม่มีอะไรหายไปชั้นของฉันดูราว ๆ นี้ตารางถูกกำหนดไว้ใน MySQL 5 5. และ Hibernate 3 6 2 mapping ดู คล้ายกับ this. I กำลังใช้ hbm2ddl สำหรับการตรวจสอบเท่านั้นและจะให้ฉันข้อผิดพลาดนี้เมื่อปรับใช้ application. If ใช้ไบนารีชนิดในการทำแผนที่จะไม่ทำให้ Hibernate คาดหวังว่าประเภทของคอลัมน์จะเป็นไบนารีแทน tinyblob I don t รู้ว่าสิ่งที่ฉันจะใช้เวลาบาง Googling นี้ แต่ couldn t หาข้อผิดพลาดแน่นอนโซลูชั่นสำหรับข้อผิดพลาดที่คล้ายกันคือ to. Specify ยาวในทรัพย์สินที่มีการเปลี่ยนแปลงชนิด Hibernate คาดว่า แต่ก็มักจะมีความหลากหลายของหยดแทนชนิดไบนารีใด ๆ s find. Instead การประกาศชนิดในองค์ประกอบคุณสมบัติสร้างองค์ประกอบของคอลัมน์และให้แอตทริบิวต์ประเภท sql ทำงานได้ แต่จะทำให้มีผลผูกพันกับ MySQL ดังนั้นฉันต้องการหลีกเลี่ยงกรณีที่เป็นไปได้ Abou t การตั้งค่านี้ที่จะทำให้ไม่ตรงกันนี้ถ้าฉันระบุไบนารีชนิดแทนหยดทำไม Hibernate คาดหวังว่าหยดแทน binary. asked 12 พฤษภาคม 11 ที่ 5 28.You ถูกต้องชนิดไบนารีแน่นอนปัญหาฉันถูกเพียงไม่ถูกต้อง สมมติว่าตั้งแต่มีหยดทั้งชนิด Hibernate และชนิด Hibernate แบบไบนารีประเภท Hibernate แบบหยดจะตรงกับประเภทต่างๆของ MySQL Blob และไบนารีจะสอดคล้องกับ binary แต่น่าเสียดายที่ไม่มี t does not เป็นประเภท Hibernate ใด ๆ ที่สอดคล้องกับ MySQL ไบนารีซึ่งดูเหมือนว่าค่อนข้างดูแลใหญ่ spaaarky21 15 พฤษภาคมที่ 11 17 04.What สิ่งที่เราสิ้นสุดการทำเพื่อแก้ปัญหาคล้ายกับนี้เขียนเอง UserType. UserTypes ของเราเองค่อนข้างง่ายในการใช้เพียงแค่สร้างชั้นที่ใช้และดำเนินการ วิธีการแทนที่คำนิยาม Hibernate ของคุณโดยใช้ประเภทผู้ใช้ค่อนข้างง่ายใส่เพียงเล็กน้อยสิ่งนี้จะทำคือรันคลาสนี้เพื่ออ่านและเขียนข้อมูลจากฐานข้อมูลโดยเฉพาะ meth ods nullSafeGet และ nullSafeSet มีการใช้งานในกรณีของเราเราใช้ข้อมูลนี้เพื่อบีบอัดข้อมูลไบนารีบีบอัดก่อนที่จะเขียนลงในฐานข้อมูลและยกเลิกการบีบอัดเป็นข้อมูลอ่านข้อมูลนี้จะซ่อนข้อมูลที่บีบอัดจากแอ็พพลิเคชันโดยใช้ข้อมูลนี้ มีแอ็พพลิเคชันที่ใช้ไฮเบอร์เนต 3 1 และ JPA คำอธิบายประกอบมีวัตถุบางอย่างที่มีแอตทริบิวต์ไบต์ 1k - 200k ในขนาดใช้คำอธิบายประกอบ JPA Lob และไฮเบอร์เนต 3 1 สามารถอ่านได้ดีในฐานข้อมูลสำคัญทั้งหมด - ดูเหมือนจะซ่อน ผู้จำหน่าย JDBC Blob peculiarities ตามที่ควรทำเราต้องอัพเกรดเป็น 3 5 เมื่อเราพบว่าไฮเบอร์เนต 3 5 พักและได้รับรางวัล t แก้ไขชุดคำอธิบายประกอบนี้ใน postgresql โดยไม่มีการแก้ปัญหาฉันยังไม่พบการแก้ไขที่ชัดเจน แจ้งให้ทราบว่าถ้าฉันเพียงลบ Lob จะใช้ bytea postgresql ประเภทที่ทำงาน แต่เฉพาะใน postgres. I กำลังมองหาวิธีที่จะมีชั้นเดียวบันทึกย่อที่มีคุณสมบัติหยดซึ่งเป็นแบบพกพาข้ามฐานข้อมูลที่สำคัญคืออะไรแบบพกพา วิธีการอธิบายข้อเขียน e property. Is นี้คงที่ในรุ่นล่าสุดบางส่วนของ hibernate. Update หลังจากอ่านบล็อกนี้ฉันได้คิดในที่สุดสิ่งที่แก้ปัญหาเดิมในปัญหา JIRA คือ Apparently คุณควรจะลด Lob และอธิบายคุณสมบัติ as. However นี้ไม่ได้ ทำงานให้ฉัน - ฉันยังคงได้รับ OIDs แทน bytea มันไม่ได้ทำงาน แต่สำหรับผู้เขียนของปัญหา JIRA ที่ดูเหมือนจะต้องการ oid. After คำตอบจากการ์เซียฉันก็พยายามคำสั่งผสมนี้ซึ่งจริงไม่ทำงานใน postgresql, แต่ไม่เกี่ยวกับ oracle. What สิ่งที่ฉันต้องทำคือการควบคุมที่ไบต์ Lob รวมกันได้รับการแมปกับ postgresql ที่นี่เป็นตัวอย่างจากจาก MaterializedBlobType sql ประเภทหยดตามบล็อก Steve s, postgresql ต้องการให้คุณใช้ Streams สำหรับ bytea don t ถามฉันว่าทำไมและ postgresql s แบบกำหนดเอง Blob สำหรับ oids โปรดทราบว่าการใช้ setBytes ใน JDBC เป็นไบต์จากประสบการณ์ที่ผ่านมาด้วยเหตุนี้อธิบายว่าทำไมการใช้สตรีมจึงไม่ส่งผลกระทบต่อพวกเขาทั้งสองจึงถือว่า bytea ผลลัพธ์นี้มีการอัพเดตคำถามตรรกะถัดไปคือ ทำไม ไม่เพียง แต่เปลี่ยนนิยามตารางด้วยตนเองเพื่อ byte และเก็บ Lob byte ทำงานนี้จนกว่าคุณจะพยายามเก็บไบต์ null ซึ่งไดรเวอร์ postgreSQL คิดว่าเป็นนิพจน์ชนิด OID และชนิดของคอลัมน์คือ bytea - เนื่องจาก hibernate ถูกต้องเรียก แทนที่จะเป็นที่คาดหวังว่าไดรเวอร์ PG ระบบประเภทในการจำศีลกำลังทำงานอยู่ในความคืบหน้าตามข้อคัดค้าน 3 5 5 ความจริงแล้วโค้ด 3 5 5 จะเลิกใช้งานแล้วมันเป็นเรื่องยากที่จะทราบว่าจะดูอย่างไรเมื่อ sub - classing PostgreSQLDialect. AFAKT ใน postgresql ควรจะแมปกับบางชนิดที่กำหนดเองซึ่งใช้วัตถุ access type OID เช่น JDBC เช่น PostgresqlBlobType และ NOT MaterializedBlobType ฉันไม่เคยใช้ Blobs กับ postgresql มาก่อน แต่ฉันรู้ว่า byte เพียงแค่ใช้งานได้เหมือนที่ฉันต้องการ คาดว่าฉันกำลังมองหาที่ BatchUpdateException - เป็นไปได้ว่าไดรเวอร์ doesn t สนับสนุนการ batching. Great ราคาจากปี 2004 เพื่อสรุป ramblings ของฉันฉัน d กล่าวว่าเราควรรอให้ไดรเวอร์ JDBC t o ทำ LOB อย่างถูกต้องก่อนที่จะเปลี่ยน Hibernate วิธีการแบบพกพาเพื่ออธิบายคุณสมบัติไบต์ขึ้นอยู่กับว่าคุณต้องการให้ JPA สามารถเก็บไบต์ที่ไม่มีคำอธิบายไว้ได้จาก JPA 2 0 spec.11 1 6 คำอธิบายประกอบพื้นฐานคำอธิบายประกอบพื้นฐานคือ ชนิดที่ง่ายที่สุดของการแม็ปกับคอลัมน์ฐานข้อมูลคำอธิบายประกอบพื้นฐานสามารถใช้กับคุณสมบัติแบบถาวรหรือตัวแปรอินสแตนซ์ของชนิดใด ๆ ต่อไปนี้ Java ดั้งเดิมชนิดห่อของชนิดดั้งเดิมดั้งเดิมไบต์ไบต์อักขระ enums อักขระและชนิดอื่น ๆ ที่ใช้งาน Serializable ตามที่อธิบายไว้ในส่วนที่ 2 8 การใช้งานของคำอธิบายประกอบพื้นฐานเป็นทางเลือกสำหรับฟิลด์และลักษณะถาวรของประเภทเหล่านี้หากไม่ได้ระบุคำอธิบายประกอบพื้นฐานสำหรับฟิลด์หรือคุณสมบัติเช่นนี้จะใช้ค่าดีฟอลต์ของคำอธิบายประกอบพื้นฐานและ Hibernate จะทำแผนที่เป็นค่าเริ่มต้นเป็น SQL VARBINARY หรือ SQL LONGVARBINARY ขึ้นอยู่กับขนาดของคอลัมน์ที่ PostgreSQL จัดการกับไบต์ แต่ถ้าคุณต้องการให้ไบต์ถูกเก็บไว้ใน Large Object คุณควรใช้ a Lob จาก spec.11 1 24 Lob Annotation. Lob annotation ระบุว่าคุณสมบัติถาวรหรือฟิลด์ควรจะยังคงอยู่เป็นอ็อบเจ็กต์ขนาดใหญ่ไปยังชนิดอ็อบเจ็กต์ขนาดใหญ่ที่รองรับฐานข้อมูลแอ็พพลิเคชันแบบพกพาควรใช้คำอธิบายประกอบ Lob เมื่อแม็ปกับฐานข้อมูล Lob พิมพ์คำอธิบายประกอบ Lob อาจใช้ร่วมกับคำอธิบายประกอบพื้นฐานหรือมีคำอธิบายประกอบ ElementCollection เมื่อค่าการเก็บรวบรวมข้อมูลเป็นประเภท Basic Lob อาจเป็นแบบไบนารีหรือแบบอักขระ Lob inferred จากประเภทของฟิลด์ถาวรหรือ คุณสมบัติและยกเว้นสตริงและตัวอักษรค่าเริ่มต้นเพื่อ Blob และ Hibernate จะแมปไปยัง SQL BLOB ที่ PostgreSQL จัดการกับ oid. Is นี้แก้ไขใน hibernate รุ่นล่าสุดบางปัญหาที่เกิดขึ้นคือฉัน don t รู้ แต่อย่างน้อยฉันสามารถพูดได้ว่าไม่มีอะไรมีการเปลี่ยนแปลงตั้งแต่ 3 5 0-Beta-2 ซึ่งเป็นที่ที่มีการเปลี่ยนแปลงได้รับการแนะนำในสาขา 3 5 x แต่ความเข้าใจในประเด็นเช่น HHH-4876 HHH-4617nd ของ PostgreSQL และ BLOB ที่กล่าวถึงใน javadoc ของ PostgreSQLDialect คือคุณควรจะตั้งค่าคุณสมบัติต่อไปนี้ถ้าคุณต้องการใช้ oid เช่น byte กับ Lob ซึ่งเป็นความเข้าใจของฉันเนื่องจาก VARBINARY ไม่ใช่สิ่งที่คุณต้องการด้วย Oracle คุณลองใช้ เป็นทางเลือก HHH-4876 แนะนำให้ใช้ PrimitiveByteArrayBlobType ที่เลิกใช้เพื่อรับลักษณะการทำงานเก่าก่อน Hibernate 3 5.JPA 2 0 ข้อมูลจำเพาะรายการ 2 8 การตั้งค่าเริ่มต้นสำหรับฟิลด์หรือคุณสมบัติอื่นที่ไม่ใช่ความสัมพันธ์ 11 1 6 คำอธิบายย่อขั้นพื้นฐาน 11 1 24 คำอธิบายประกอบเกี่ยวกับใบ จัสตินอย่างไรก็ตามในขณะที่จำศีล 3 5 แผนที่ไป oid ตามค่าเริ่มต้นจะอ่านโดยใช้ JBBC getBytes ซึ่งไดรเวอร์ PGSQL ส่งกลับ oid 6 ไบต์แทนข้อมูล - ไม่นี้เกิดขึ้นเมื่อใช้มากเกินไปจะตรวจสอบสิ่งที่ Steve กล่าวตอนนี้ Pascal Thivent 17 กันยายน 10 ที่ 21 37.Here ไปสิ่ง O reilly Enterprise JavaBeans, 3 0 saysJDBC มีชนิดพิเศษสำหรับวัตถุที่มีขนาดใหญ่มากเหล่านี้ชนิดแสดงข้อมูลไบนารีและแสดงข้อมูลตัวอักษรที่นี่ไป PostgreSQLDialect source code ดังนั้นสิ่งที่คุณสามารถทำได้ทำ Override PostgreSQLDialect ดังนี้ ตอนนี้เพียงแค่กำหนด dialect. And ของคุณแบบพกพา JPA Lob annotation. Here ได้รับการแยก here. I มีโปรแกรมประยุกต์ที่ทำงานใน hibernate 3 3 2 และโปรแกรมทำงานได้ดีกับทุกสาขาหยดโดยใช้ oid byte ใน java. Migrating to hibernate 3 5 บล็อกหยดทั้งหมดไม่ทำงานอีกต่อไปและบันทึกเซิร์ฟเวอร์แสดงคอลัมน์ ERROR - ERROR เป็นประเภท oid แต่การแสดงออกเป็นประเภท bytea โดยทั่วไปนี่ไม่ใช่ข้อผิดพลาดใน PG JDBC แต่เปลี่ยนการใช้งาน Hibernate เป็นค่าเริ่มต้นใน 3 5 versi on ในสถานการณ์ของฉันการตั้งค่าคุณสมบัติที่เข้ากันได้เกี่ยวกับการเชื่อมต่อไม่ได้ช่วยมากยิ่งขึ้นสิ่งที่ฉันเห็นใน 3 5 - beta 2 และฉันไม่ทราบว่านี้ได้รับการแก้ไข Hibernate - โดยไม่มีคำอธิบายประกอบประเภท - อัตโนมัติจะสร้างคอลัมน์ของชนิด oid , แต่จะพยายามอ่านนี้เป็น bytea. Interesting เป็นเพราะเมื่อเขาแผนที่เป็น byte ดู CustomPostgreSQLDialect เขา get. Could ไม่รันการปรับปรุงชุด JDBC เมื่อใส่หรือปรับปรุง Hibernate - Mapping Files. An Object การแม็ปสัมพันธ์มักจะกำหนดใน XML เอกสารไฟล์การทำแผนที่นี้จะสอน Hibernate ว่าจะทำแผนที่ชั้นหรือชั้นเรียนที่กำหนดไว้ในตารางฐานข้อมูลได้อย่างไรแม้ว่าผู้ใช้ Hibernate หลายคนเลือกที่จะเขียน XML ด้วยมือ แต่เครื่องมือเหล่านี้มีอยู่มากมายในการสร้างเอกสารการทำแผนที่ซึ่งประกอบด้วย XDoclet, Middlegen และ AndroMDA สำหรับขั้นสูง ผู้ใช้ไฮเบอร์เนตให้เราพิจารณาชั้น POJO ที่กำหนดไว้ก่อนหน้านี้ซึ่งมีออบเจ็กต์อยู่ในตารางที่กำหนดไว้ในส่วนถัดไปซึ่งจะเป็นตารางที่ตรงกับแต่ละออบเจกต์ที่คุณยินดีที่จะให้ persi stence พิจารณาข้างต้นวัตถุต้องเก็บและเรียกข้อมูลลงในตาราง RDBMS ต่อไปนี้ขึ้นอยู่กับสองหน่วยงานข้างต้นเราสามารถกำหนดไฟล์แผนที่ต่อไปนี้ซึ่งจะสอนวิธีไฮเบอร์เนตเพื่อทำแผนที่ชั้นหรือชั้นเรียนที่กำหนดไว้ในตารางฐานข้อมูลคุณควรบันทึกเอกสารการทำแผนที่ ในไฟล์ที่มี classname class เราบันทึกเอกสารแผนที่ของเราไว้ในไฟล์ลองดูรายละเอียดเล็กน้อยเกี่ยวกับองค์ประกอบแผนที่ที่ใช้ในไฟล์ mapping เอกสารการทำแผนที่เป็นเอกสาร XML ที่มี hibernate-mapping เป็นองค์ประกอบหลักซึ่งมี class ทั้งหมด องค์ประกอบ class ถูกใช้เพื่อกำหนดแม็พเฉพาะจากคลาส Java ไปยังตารางฐานข้อมูลชื่อคลาส Java ถูกระบุโดยใช้แอ็ตทริบิวต์ name ของอิลิเมนต์ class และระบุชื่อตารางฐานข้อมูลโดยใช้แอตทริบิวต์ table เมตาดาต้าจะไม่ใส่ก็ได้ และสามารถนำมาใช้เพื่อสร้าง class description องค์ประกอบ id จะจับคู่ ID attribute ในคลาสกับคีย์หลักของตารางฐานข้อมูลชื่อ a ttribute ขององค์ประกอบ id หมายถึงคุณสมบัติในคลาสและแอตทริบิวต์คอลัมน์อ้างอิงถึงคอลัมน์ในตารางฐานข้อมูลแอตทริบิวต์ type ถือประเภทแผนที่การจำศีลชนิดการแม็พนี้จะแปลงจาก Java ไปเป็น SQL ข้อมูลชนิดองค์ประกอบ generator ภายใน id จะใช้ในการสร้างค่าคีย์หลักโดยอัตโนมัติตั้งค่าแอตทริบิวต์ class ขององค์ประกอบ Generator ถูกตั้งค่าเป็น native เพื่อให้ไฮเบอร์เนตรับอัลกอริทึม identity, sequence หรือ hilo เพื่อสร้างคีย์หลักขึ้นอยู่กับความสามารถของฐานข้อมูลอ้างอิงคุณสมบัติ element ถูกใช้เพื่อแม็พคุณสมบัติคลาสภาษาจาวากับคอลัมน์ในตารางฐานข้อมูลแอ็ตทริบิวต์ name ของ element หมายถึงคุณสมบัติในคลาสและแอตทริบิวต์ column อ้างอิงถึงคอลัมน์ในตารางฐานข้อมูล attribute type ถือชนิดการทำแผนที่ hibernate, ชนิดการแม็ปนี้จะแปลงจากชนิดข้อมูล Java ไปเป็น SQL มีแอตทริบิวต์และองค์ประกอบอื่นที่พร้อมใช้งานซึ่งจะใช้ในเอกสารการทำแผนที่และฉันต้องการ ould พยายามที่จะครอบคลุมมากที่สุดเท่าที่เป็นไปได้ในขณะที่พูดคุยเกี่ยวกับหัวข้ออื่น ๆ ที่เกี่ยวข้องกับ Hibernate 1 1 การทำ mapping declaration การแม็ป mapping สัมพันธ์มักถูกกำหนดไว้ในเอกสาร XML เอกสาร mapping ถูกออกแบบมาให้สามารถอ่านได้และสามารถแก้ไขได้ด้วยมือภาษา mapping เป็น Java - หมายความว่าการแม็พจะถูกสร้างขึ้นโดยใช้การประกาศคลาสแบบถาวรและไม่ใช่การประกาศตารางโปรดทราบว่าแม้ว่าผู้ใช้ไฮเบอร์เนตจำนวนมากเลือกที่จะเขียน XML ด้วยมือ แต่มีเครื่องมือหลายอย่างในการสร้างเอกสารการทำแผนที่ซึ่ง ได้แก่ XDoclet, Middlegen และ AndroMDA ที่นี่ mapping. We ตอนนี้จะกล่าวถึงเนื้อหาของเอกสารแผนที่เราจะอธิบายอย่างไรองค์ประกอบเอกสารและแอตทริบิวต์ที่ Hibernate ใช้เมื่อรันไทม์เอกสารแผนที่ยังมีแอตทริบิวต์และองค์ประกอบที่เป็นตัวเลือกเพิ่มเติมที่มีผลต่อสกีมาฐานข้อมูล โดยใช้เครื่องมือการเอ็กซ์พอร์ตเชดเช่นแอ็ตทริบิวต์ not-null 5 1 1 Doctype. All การแม็พ XML ควรประกาศ o doctype hook จริง DTD สามารถพบได้ที่ URL ด้านบนในไดเร็กทอรี hibernate-x xx src org Hibernate หรือใน Hibernate มักจะค้นหา DTD ใน classpath ของตัวเองก่อนถ้าคุณพบ lookups ของ DTD โดยใช้การเชื่อมต่ออินเทอร์เน็ตให้ตรวจสอบ DTD การประกาศต่อเนื้อหาของ classpath ของคุณ 5 1 1 1 EntityResolver. Hibernate จะพยายามแก้ไข DTD ใน classpath ของตนเองเป็นครั้งแรกโดยทำาการลงทะเบียนการใช้งานแบบกำหนดเองกับ SAXReader ที่ใช้ในการอ่านไฟล์ xml EntityResolver ที่กำหนดเองนี้จะจำแนกได้สองแบบ systemId namespaces. a hibernate namespace ได้รับการยอมรับเมื่อใดก็ตามที่ resolver พบ systemId โดยเริ่มต้นด้วย Resolver พยายามแก้ไขหน่วยงานเหล่านี้ผ่านทาง classloader ซึ่งโหลดคลาส Hibernate classes. a namespace ผู้ใช้จะได้รับการยอมรับเมื่อใดก็ตามที่ resolver พบ systemId โดยใช้โปรโตคอล URL classpath Resolver จะพยายามแก้ไขเอนทิตีเหล่านี้ผ่านทาง 1 classloader บริบทของเธรดปัจจุบันและ 2 classloader ที่โหลด Hibernate classes ดังต่อไปนี้เป็นตัวอย่างของการใช้ namespacing ของผู้ใช้ในกรณีที่มีทรัพยากรในแพ็กเกจและมี typedef.5 ที่กำหนดเอง 1 2 Hibernate-mapping องค์ประกอบนี้มีแอตทริบิวต์ที่มีให้เลือกหลายแอตทริบิวต์ schema และ catalog ระบุว่าตารางที่อ้างถึง ในการทำแผนที่นี้จะอยู่ใน schema ที่มีชื่อและแค็ตตาล็อกหรือหากมีการระบุไว้ tablename จะได้รับการรับรองตามสคีมาและชื่อแค็ตตาล็อกที่ระบุถ้าไม่มีอยู่ tablenames จะไม่มีคุณสมบัติแอตทริบิวต์ cascade ดีฟอลต์จะระบุว่าควรกำหนดคุณสมบัติของ cascade สำหรับคุณสมบัติใด และคอลเลกชันที่ไม่ได้ระบุแอตทริบิวต์น้ำตกตามค่าดีฟอลต์แอ็ตทริบิวต์ auto-import ช่วยให้คุณสามารถใช้ชื่อคลาสที่ไม่เหมาะสมได้ใน query language. schema เลือกชื่อของ schema. entity ฐานข้อมูลชื่อ optional - ค่าดีฟอลต์ของชื่อคลาส Hibernate3 คลาสที่จะถูกแม็พหลายครั้งอาจเป็นตารางที่ต่างกันนอกจากนี้ยังช่วยให้สามารถแมปเอนทิตีที่แสดงโดย Maps หรือ XML ได้ที่ระดับ Java I n กรณีนี้คุณควรระบุชื่อที่ชัดเจนสำหรับเอนทิตีดูส่วน 4 4 โมเดลแบบไดนามิกและบทที่ 18 การแม็พ XML เพื่อดูข้อมูลเพิ่มเติมโปรดเลือกนิพจน์ SQL ที่ใช้ในการสร้างข้อ จำกัด ในการตรวจสอบหลายแถวสำหรับการสร้างสคีมาอัตโนมัติ rowid ตัวเลือกไฮเบอร์เนตสามารถใช้ ROWID บนฐานข้อมูลใน Oracle เช่น Hibernate สามารถใช้คอลัมน์พิเศษ rowid สำหรับการปรับปรุงอย่างรวดเร็วเมื่อตัวเลือกนี้ได้รับการตั้งค่าเป็น rowid ROWID เป็นรายละเอียดการใช้งานและแสดงถึงตำแหน่งทางกายภาพของ tuple. subselect ที่จัดเก็บไว้ แม็ทเอนทิตีที่ไม่เปลี่ยนรูปและแบบอ่านอย่างเดียวในฐานข้อมูล subselect นี่เป็นประโยชน์ถ้าคุณต้องการให้มีมุมมองแทนตารางพื้นฐานดูด้านล่างเพื่อดูข้อมูลเพิ่มเติมการบีบอัดข้อมูลนามธรรมจะใช้ในการจำแนกระดับชั้นนามธรรม (subclass hierarchy) สำหรับคลาสที่มีชื่อว่าอินเทอร์เฟซคุณสามารถประกาศใช้ชั้นเรียนของอินเทอร์เฟซโดยใช้องค์ประกอบย่อยได้คุณสามารถคงที่ชั้นภายในแบบคงที่ระบุคลาส ass ชื่อโดยใช้รูปแบบมาตรฐาน i. Immutable คลาส mutable เท็จไม่สามารถปรับปรุงหรือลบโดยแอ็พพลิเคชันนี้จะช่วยให้ Hibernate ทำการเพิ่มประสิทธิภาพการทำงานขั้นต่ำบางอย่างแอตทริบิวต์พร็อกซีไม่จำเป็นช่วยให้การเริ่มต้นใช้งานที่ไม่เป็นที่รู้จักของชั้น Hibernate จะคืน CGLIB proxies ที่ใช้อินเทอร์เฟซที่มีชื่อออบเจ็กต์ถาวรจะโหลดเมื่อมีการเรียกใช้เมธอดของพร็อกซีดูการเริ่มต้นคอลเล็กชันและพร็อกซีด้านล่างนี้ polymorphism โดยนัยหมายความว่าอินสแตนซ์ของคลาสจะถูกส่งคืนโดยแบบสอบถามที่ชื่อ superclass หรืออินเทอร์เฟซหรือคลาสที่ใช้งาน และอินสแตนซ์ของคลาสย่อยใด ๆ ของคลาสจะถูกส่งคืนโดยแบบสอบถามที่ชื่อคลาสเองโพลาไรเซชันที่แน่ชัดหมายความว่าอินสแตนซ์ของคลาสจะถูกส่งคืนโดยแบบสอบถามที่ระบุชื่อคลาสที่เฉพาะเจาะจงว่าคลาสจะคืนเฉพาะอินสแตนซ์ของคลาสย่อยที่แม็ปภายในเท่านั้น ประกาศคลาสนี้เป็น subclass หรือ join-subclass สำหรับวัตถุประสงค์ส่วนใหญ่ th e polymorphism เริ่มต้น implicit มีความเหมาะสม polymorphism ชัดเจนจะเป็นประโยชน์เมื่อสองชั้นที่แตกต่างกันถูกแมปไปยังตารางเดียวกันนี้จะช่วยให้คลาสที่มีน้ำหนักเบาที่มีชุดย่อยของคอลัมน์ในตารางแอตทริบิวต์ persister ช่วยให้คุณสามารถกำหนดกลยุทธ์การติดตาที่ใช้สำหรับคลาสคุณสามารถ, ตัวอย่างเช่นระบุคลาสย่อยของคุณเองหรือคุณสามารถให้การติดตั้งอินเทอร์เฟซใหม่ที่ใช้งานได้อย่างสมบูรณ์ตัวอย่างเช่นการติดตาผ่านการจัดเก็บการเรียกกระบวนการ serialization ไปยังไฟล์แบบแบนหรือ LDAP ดูตัวอย่างง่ายๆของการติดตาไปยัง Hashtable การปรับปรุงแบบไดนามิกและการตั้งค่าการแทรกแบบไดนามิกไม่สืบทอดโดย subclasses ดังนั้นพวกเขาสามารถระบุใน subclass หรือเข้าร่วม subclass องค์ประกอบแม้ว่าการตั้งค่าเหล่านี้สามารถเพิ่มประสิทธิภาพการทำงานในบางกรณีพวกเขาจริงสามารถลดประสิทธิภาพการทำงานใน other. Use ของ select - การอัปเดตก่อนจะช่วยลดประสิทธิภาพการทำงานได้มีประโยชน์ในการป้องกันไม่ให้เรียกใช้การเรียกข้อมูลฐานข้อมูลโดยไม่จำเป็นหากคุณกำลัง reat tach กราฟของกรณีที่แยกออกไป Session หากคุณเปิดใช้งานการปรับปรุงแบบไดนามิกคุณจะมีทางเลือกของกลยุทธ์การล็อกในแง่ดีตรวจสอบเวอร์ชัน timeless คอลัมน์ columns. all ตรวจสอบ columns. dirty ทั้งหมดตรวจสอบการเปลี่ยนแปลงคอลัมน์ที่ช่วยให้การปรับปรุงพร้อมกันบางอย่าง อย่าใช้การล็อกแบบ optimistic ขอแนะนำอย่างยิ่งให้คุณใช้คอลัมน์ timestamp เวอร์ชันสำหรับการล็อกแบบ optimistic ด้วย Hibernate กลยุทธ์นี้จะเพิ่มประสิทธิภาพและจัดการกับการปรับเปลี่ยนที่เกิดขึ้นกับอินสแตนซ์ที่ถูกแยกออกไปเช่นเมื่อใช้งานไม่มีข้อแตกต่างระหว่างมุมมองกับตารางฐาน การทำแผนที่ Hibernate นี่คือความโปร่งใสในระดับฐานข้อมูลแม้ว่าบาง DBMS ไม่สนับสนุนมุมมองอย่างถูกต้องโดยเฉพาะอย่างยิ่งกับการปรับปรุงบางครั้งคุณต้องการใช้มุมมอง แต่คุณไม่สามารถสร้างในฐานข้อมูลเช่นกับ schema แบบเดิมในกรณีนี้คุณสามารถ แม็ทเอนทิตีที่ไม่เปลี่ยนรูปและแบบอ่านอย่างเดียวกับนิพจน์ subselect ของ SQL ที่กำหนดให้ใช้ตารางเพื่อซิงค์เอนทิตีนี้ด้วยเพื่อให้แน่ใจว่าการล้างข้อมูลอัตโนมัติเกิดขึ้นร่วมกัน อย่างถูกต้องและการสอบถามกับเอนทิตีที่ได้รับจะไม่ส่งคืนข้อมูลที่ค้างอยู่ subselect มีทั้งแอตทริบิวต์และองค์ประกอบ mapping ที่ซ้อนกันคลาสที่ถูกบีบอัดต้องประกาศคีย์หลักของตารางฐานข้อมูลคลาสส่วนใหญ่จะมีคุณสมบัติแบบ JavaBeans ด้วย ตัวระบุที่ไม่ซ้ำกันของอินสแตนซ์องค์ประกอบ id กำหนดการแม็ปจากพร็อพเพอร์ตี้นั้นไปยังคีย์หลัก column. name ชื่ออ็อบเจ็กต์ property. formula ตัวระบุตัวเลือกนิพจน์ SQL ที่กำหนดค่าสำหรับคีย์ foreign foreign คำนวณการกำหนดค่าของ แอตทริบิวต์น้ำตกกับค่าที่มีความหมายอื่นที่ไม่ใช่ไม่มีจะเผยแพร่การดำเนินงานบางอย่างไปยังวัตถุที่เกี่ยวข้องค่าที่มีความหมายแบ่งออกเป็นสามประเภทแรกการดำเนินงานขั้นพื้นฐานซึ่งรวมถึงการมีอยู่ผสานลบบันทึกปรับปรุงขับไล่ทำซ้ำล็อกและฟื้นฟูวินาที , ค่าพิเศษลบกำพร้าและที่สามทั้งหมดที่คั่นด้วยเครื่องหมายจุลภาคของการรวมกันของชื่อการดำเนินการน้ำตกยังคงมีอยู่ผสานขับไล่หรือน้ำตกทั้งหมดลบ ดูส่วนที่ 10 11 การดำรงอยู่ของการทรุดตัวเพื่ออธิบายอย่างเต็มรูปแบบโปรดทราบว่าสมาคมที่มีค่ามากความสัมพันธ์แบบหนึ่งต่อหนึ่งและแบบตัวต่อตัวไม่สนับสนุนการลบของเด็กกำพร้านี่เป็นตัวอย่างของการประกาศแบบหลายต่อหลายแบบ แอตทริบิวต์ property-ref ควรใช้เฉพาะสำหรับการแม็พข้อมูลแบบเดิมที่คีย์ต่างประเทศหมายถึงคีย์ที่ไม่ซ้ำกันของตารางที่เชื่อมโยงอื่นนอกเหนือจากคีย์หลักนี่คือโมเดลเชิงสัมพันธ์ที่ซับซ้อนและสับสนตัวอย่างเช่นถ้าชั้น Product มีเอกลักษณ์ เลขที่ประจำผลิตภัณฑ์ที่ไม่ใช่คีย์หลักแอตทริบิวต์ที่ไม่ซ้ำกันจะควบคุมการสร้าง DDL ของ Hibernate ด้วยเครื่องมือ SchemaExport จากนั้นอาจมีการทำแผนที่สำหรับ OrderItem โดยไม่ได้รับการสนับสนุนอย่างไรก็ตามหากคีย์ที่ไม่ซ้ำที่อ้างถึงประกอบด้วยคุณสมบัติหลายรายการของเอนทิตีที่เกี่ยวข้อง ควรแม็พพร็อพเพอร์ตี้ที่อ้างถึงภายในออบเจคต์ properties ที่มีชื่อหากคีย์ที่ไม่ซ้ำกันที่อ้างถึงเป็นคุณสมบัติของคอมโพเนนต์คุณสามารถระบุพา ธ คุณสมบัติ 5 1 13 One-to-one.5 2 1 เอนทิตีและค่านิยม การบริการแบบติดตาวัตถุระดับภาษา Java ถูกแบ่งออกเป็นสองกลุ่มเอนทิตีมีอยู่จริงจากอ็อบเจ็กต์อื่นที่มีการอ้างอิงไปยังเอนทิตีตรงกันข้ามกับรูปแบบ Java ตามปกติซึ่งวัตถุที่ไม่ได้รับการตอบสนองคือการเก็บขยะเอนทิตีจะต้องถูกบันทึกและลบอย่างชัดเจน บันทึกและลบอย่างไรก็ตามสามารถเรียงซ้อนจากเอนทิตีหลักไปยังลูกของตนซึ่งจะแตกต่างจากรูปแบบ ODMG ของการติดตาของวัตถุโดยสามารถเข้าถึงได้และสอดคล้องกับวิธีการใช้แอ็พพลิเคชันอ็อบเจ็กต์ในระบบที่มีขนาดใหญ่มากขึ้นหน่วยงานสนับสนุนวงกลมและการอ้างอิงที่ใช้ร่วมกันได้ นอกจากนี้ยังมีสถานะแบบถาวรของเอนทิตีรวมถึงการอ้างอิงไปยังเอนทิตีและอินสแตนซ์ประเภทค่าอื่น ๆ ค่าคือคอลเล็กชันแบบดั้งเดิมไม่ใช่สิ่งที่อยู่ภายในคอลเลกชันคอมโพเนนต์และอ็อบเจ็กต์ที่ไม่เปลี่ยนรูปอย่างอื่นซึ่งต่างจากเอนทิตีค่าในคอลเล็กชันและส่วนประกอบที่เฉพาะเจาะจง เนื่องจากวัตถุค่าและ primitives จะยังคงอยู่และ d elimination พร้อมกับเอนทิตีที่มีอยู่ของพวกเขาพวกเขาไม่สามารถกำหนดค่าได้อย่างอิสระค่านิยมไม่มีอัตลักษณ์ที่เป็นอิสระดังนั้นพวกเขาจึงไม่สามารถแบ่งปันโดยทั้งสองเอนทิตีหรือคอลเลกชันได้จนถึงตอนนี้เราใช้คลาสที่มีอยู่ถาวรเพื่ออ้างถึง entity เราจะทำแบบนั้นต่อไป ไม่ใช่คลาสที่ผู้ใช้กำหนดเองทั้งหมดที่มีสถานะแบบถาวร แต่เป็นเอนทิตีคอมโพเนนต์คือคลาสที่ผู้ใช้กำหนดด้วยความหมายของค่าแอ็ตทริบิวต์ Java ของชนิดมีความหมายค่าให้นิยามนี้คลาสทั้งหมดที่จัดเตรียมโดย JDK มีความหมายประเภทค่า ใน Java ในขณะที่ชนิดที่ผู้ใช้กำหนดสามารถแม็พกับเอนทิตีเอนทิตีหรือค่าได้การตัดสินใจนี้ขึ้นอยู่กับนักพัฒนาแอ็พพลิเคชันคลาสเอนทิตีในโมเดลโดเมนจะมีการอ้างอิงไปยังอินสแตนซ์เดียวของคลาสนั้นในขณะที่องค์ประกอบหรือการสรุปรวม แปลเป็น type. We ค่าจะกลับมายังทั้งสองแนวคิดตลอดคู่มืออ้างอิงนี้ความท้าทายคือการแผนที่ระบบประเภท Java และความหมายของนักพัฒนาของ en tities และชนิดค่าไปยังระบบชนิดของฐานข้อมูล SQL สะพานเชื่อมต่อระหว่างระบบทั้งสองมีให้โดย Hibernate สำหรับเอนทิตีชั้นย่อยและอื่น ๆ สำหรับประเภทค่าที่เราใช้ส่วนประกอบคุณสมบัติ ฯลฯ ซึ่งมักมีแอ็ตทริบิวต์ type ค่าของแอ็ตทริบิวต์นี้คือ ชื่อของประเภทการทำแผนที่ Hibernate Hibernate มีช่วงของการแมปสำหรับประเภทค่ามาตรฐานของ JDK ออกจากกล่องคุณสามารถเขียนประเภทการทำแผนที่ของคุณเองและใช้กลยุทธ์การแปลงที่กำหนดเองของคุณเองได้ยกเว้นยกเว้นคอลเล็กชันการสนับสนุน Hibernate ในตัวทั้งหมด semantics โมฆะ 5 2 2 ประเภทของค่าพื้นฐานประเภทการแม็ปขั้นพื้นฐานที่มีอยู่ภายในได้แบ่งออกได้เป็นประเภทดังต่อไปนี้ตัวยาว, ยาว, สั้น, ลอย, คู่, ตัวอักษร, ไบต์, boolean, yesno, truefalse การแม็พไทม์จาก Java primitives หรือชั้น wrapper ไปยังผู้ขายที่เหมาะสมเฉพาะประเภทคอลัมน์ SQL บูลีน, yesno และ truefalse มีการเข้ารหัสทางเลือกทั้งหมดสำหรับการทำแบบบูล Java หรือการแมปชนิดจาก VARCHAR หรือ Oracle VARCHAR2.date เวลา tim estamp ใช้การแมปจากและ subclasses ไปยังประเภท SQL DATE TIME และ TIMESTAMP หรือเทียบเท่าการแม็ป map จาก SQL ประเภท TIMESTAMP และ DATE หรือเทียบเท่าหรือการแม็ป map จากและไปยัง NUMERIC หรือ Oracle NUMBER. locale, timezone, currency. Type mappings from and เพื่อ VARCHAR หรือ Oracle VARCHAR2 อินสแตนซ์ของตำแหน่งที่ตั้งและสกุลเงินถูกแม็ปกับรหัส ISO ของพวกเขาตัวอย่างของ TimeZone ถูกแมปกับการแม็ปชนิด ID. A จาก VARCHAR หรือ Oracle VARCHAR2 คลาสถูกแม็ปกับชื่อเต็มว่ามีอาร์เรย์ของไบต์ไปที่เหมาะสม SQL binary type. Maps สตริง Java ยาวไปยัง SQL CLOB หรือ TEXT type. Maps serializable Java ชนิดที่เหมาะสมชนิดไบนารี SQL นอกจากนี้คุณยังสามารถระบุชนิด Hibernate serializable ด้วยชื่อของคลาส serializable Java หรืออินเทอร์เฟซที่ไม่ได้เป็นค่าเริ่มต้น ชนิดพื้นฐานการแม็พแผนที่สำหรับคลาส JDBC และประเภทนี้อาจไม่สะดวกสำหรับแอ็พพลิเคชันบางอย่างเนื่องจากวัตถุ blob หรือ clob ไม่สามารถนำกลับมาใช้ใหม่ได้นอกการทำธุรกรรมการสนับสนุนไดร์เวอร์เป็นแบบ a การแมป immbinary. Type สำหรับสิ่งที่ถือเป็นชนิด Java ที่ไม่สามารถเปลี่ยนแปลงได้ซึ่งเป็นที่ที่ Hibernate ทำให้การเพิ่มประสิทธิภาพบางอย่างเหมาะสมสำหรับประเภท Java ที่ไม่เปลี่ยนรูปเท่านั้นและแอ็พพลิเคชันถือว่าอ็อบเจ็กต์ที่ไม่เปลี่ยนรูปตัวอย่างเช่น คุณไม่ควรเรียกอินสแตนซ์ที่แมปเป็น immtimestamp เมื่อต้องการเปลี่ยนค่าของคุณสมบัติและมีการเปลี่ยนแปลงที่ทำถาวรแอ็พพลิเคชันต้องกำหนดใหม่ nonidentical ออบเจ็กต์กับคุณสมบัติตัวระบุที่ไม่ซ้ำกันของเอนทิตีและคอลเลกชันสามารถใด ๆ ชนิดพื้นฐานยกเว้นไบนารีหยดและ clob นอกจากนี้ยังได้รับอนุญาตให้ดูด้านล่างสำหรับข้อมูลเพิ่มเติมชนิดค่าพื้นฐานมีค่าคงที่ในรูปแบบที่สอดคล้องกันเช่นตัวอย่างประเภทสตริง 5 2 3 ประเภทค่าที่กำหนดเองซึ่งเป็นเรื่องง่ายสำหรับนักพัฒนาซอฟต์แวร์ สร้างชนิดค่าของตัวเองตัวอย่างเช่นคุณอาจต้องการคงคุณสมบัติของชนิดไปยังคอลัมน์ VARCHAR ไฮเบอร์เนตไม่ provid ea แบบ built-in สำหรับ Custom Type นี้ไม่ จำกัด เฉพาะการแม็พพร็อพเพอร์ตี้หรือคอลเล็กชันกับคอลัมน์ตารางเดียวตัวอย่างเช่นคุณอาจมีคุณสมบัติ Java getName setName ประเภทที่ยังคงอยู่ในคอลัมน์ FIRSTNAME INITIAL SURNAME เมื่อต้องการใช้ชนิดที่กำหนดเองให้ใช้คุณสมบัติอย่างใดอย่างหนึ่งหรือและประกาศใช้คุณสมบัติที่มีคุณสมบัติครบถ้วน classname ของชนิด View เพื่อดูชนิดของสิ่งต่างๆที่เป็นไปได้การใช้แท็กคอลัมน์เพื่อแม็พพร็อพเพอร์ตี้กับหลายคอลัมน์ CompositeUserType EnhancedUserType UserCollectionType และอินเทอร์เฟซ UserVersionType ให้การสนับสนุนสำหรับการใช้งานที่เฉพาะเจาะจงมากยิ่งขึ้นนอกจากนี้คุณยังสามารถจัดหาพารามิเตอร์ให้กับ UserType ในไฟล์การทำแผนที่ได้ด้วยวิธีนี้ UserType ของคุณต้องใช้อินเทอร์เฟซเพื่อจัดหาพารามิเตอร์ให้กับชนิดที่กำหนดเองของคุณคุณสามารถใช้อิลิเมนต์ type ในไฟล์การแม็ปของคุณ ขณะนี้ UserType สามารถดึงข้อมูลค่าสำหรับพารามิเตอร์ที่ชื่อว่าดีฟอลต์จากอ็อบเจ็กต์ Properties ที่ส่งผ่านไปได้หากคุณใช้ UserType เป็นประจำจะใช้งานได้เป็นประจำ ul เพื่อกำหนดชื่อที่สั้นกว่านี้คุณสามารถทำได้โดยใช้ Typedefs typedef Typingefs กำหนดชื่อให้กับประเภทที่กำหนดเองและยังสามารถมีรายการค่าพารามิเตอร์ดีฟอลต์ได้หากมีพารามิเตอร์ประเภท parameterized นอกจากนี้ยังสามารถแทนที่พารามิเตอร์ที่ให้มาได้ ใน typedef ในแต่ละกรณีโดยใช้พารามิเตอร์ชนิดในการแม็พ mapping แม้ว่าชุด Hibernate จะมีประเภท built-in ที่หลากหลายและการสนับสนุนคอมโพเนนต์หมายความว่าคุณไม่จำเป็นต้องใช้ประเภทที่กำหนดเอง แต่อย่างใดถือว่าดี การปฏิบัติที่จะใช้ชนิดที่กำหนดเองสำหรับคลาสที่ไม่ใช่เอนทิตีที่เกิดขึ้นบ่อยๆในแอ็พพลิเคชันของคุณตัวอย่างเช่นคลาส MonetaryAmount เป็นผู้สมัครที่ดีสำหรับ CompositeUserType แม้ว่าจะสามารถแมปเป็นคอมโพเนนต์เหตุผลหนึ่งประการนี้คือ abstraction ด้วยประเภทที่กำหนดเอง เอกสารแผนที่จะได้รับการคุ้มครองจากการเปลี่ยนแปลงทางค่าเงินจะถูกแสดง [3] Mapping class มากกว่าหนึ่งครั้งซึ่งเป็นไปได้ที่จะให้มากกว่าหนึ่ง mapping สำหรับคลาสที่ถาวร e คุณต้องระบุชื่อเอนทิตีเพื่อแยกแยะระหว่างอินสแตนซ์ของเอนทิตีที่แม็ปสองตัวโดยค่าเริ่มต้นชื่อเอนทิตีจะเหมือนกับชื่อคลาส Hibernate ช่วยให้คุณสามารถระบุชื่อเอนทิตีเมื่อทำงานกับอ็อบเจ็กต์ถาวรเมื่อเขียนข้อความค้นหาหรือเมื่อทำแผนที่ association names. Associations ถูกระบุโดยใช้ entity-name แทน class.5 4 SQL quoted identifiers. You สามารถบังคับ Hibernate เพื่ออ้างตัวระบุใน SQL ที่สร้างขึ้นโดยล้อมรอบตารางหรือชื่อคอลัมน์ใน backticks ในเอกสารแผนที่ Hibernate จะใช้รูปแบบการเสนอราคาที่ถูกต้องสำหรับ Dialect SQL โดยปกติจะใช้เครื่องหมายคำพูดคู่ แต่ SQL Server ใช้วงเล็บและ MySQL ใช้ backticks.5 5 Metadata alternatives.5 5 1 การใช้ Markup XDoclet ผู้ใช้ Hibernate หลายรายต้องการฝังข้อมูลการแม็ปโดยตรงในซอร์สโค้ด ใช้ XDoclet เราไม่ได้กล่าวถึงแนวทางนี้ในคู่มืออ้างอิงนี้เนื่องจากถือว่าเป็นส่วนหนึ่งของ XDoclet อย่างไรก็ตามเราได้รวมตัวอย่างต่อไปนี้ไว้ในชั้นเรียนของแมว h XDoclet mappings ดูเว็บไซต์ Hibernate สำหรับตัวอย่างเพิ่มเติมของ XDoclet และ Hibernate.5 5 2 การใช้ JDK 5 0 Annotations. JDK 5 0 ได้แนะนำคำอธิบายประกอบสไตล์ XDoclet ในระดับภาษาที่ปลอดภัยและถูกตรวจสอบในช่วงเวลาที่คอมไพล์กลไกนี้มี มีประสิทธิภาพมากขึ้นกว่าคำอธิบายประกอบ XDoclet และได้รับการสนับสนุนจากเครื่องมือและ IDEs ดียิ่งขึ้น IntelliJ IDEA สนับสนุนการเติมแต่งอัตโนมัติและการเน้นไวยากรณ์ของคำอธิบายประกอบ JDK 5 0 การแก้ไขใหม่ของข้อกำหนด EJB JSR-220 ใช้คำอธิบายประกอบ JDK 5 0 เป็นกลไกหลักของเมตาดาต้า สำหรับเอ็นติตี้เอนเซ็ท Hibernate3 ใช้ EntityManager ของ JSR-220 API Persistence การสนับสนุนเมทาดาทาการแมปมีให้ผ่านทางแพคเกจ Annberts Hibernate เป็นการดาวน์โหลดแยกต่างหากข้อมูลเมตาดาต้าทั้ง EJB3 JSR-220 และ Hibernate3 ได้รับการสนับสนุนนี่เป็นตัวอย่างของคลาส POJO ที่มีคำอธิบายประกอบว่า bean การสนับสนุน JDK 5 0 คำอธิบายประกอบและ JSR-220 กำลังอยู่ระหว่างการพัฒนาโปรดดูโมดูลคำอธิบาย Hibernate สำหรับรายละเอียดเพิ่มเติม 5 Gen คุณสมบัติที่สร้างขึ้นเป็นคุณสมบัติที่มีค่าที่สร้างขึ้นโดยฐานข้อมูลโดยปกติโปรแกรมประยุกต์ Hibernate จำเป็นต้องรีเฟรชอ็อบเจ็กต์ที่มีคุณสมบัติใด ๆ ที่ฐานข้อมูลกำลังสร้างค่าการทำเครื่องหมายคุณสมบัติที่สร้างขึ้นอย่างไรก็ตามอนุญาตให้แอ็พพลิเคชันมอบหมายความรับผิดชอบนี้ให้กับ Hibernate When ไฮเบอร์เนตจะออก SQL INSERT หรือ UPDATE สำหรับเอนทิตีที่กำหนดคุณสมบัติที่สร้างขึ้นทันทีหลังจากเลือกตัวเลือกนี้เพื่อเรียกคืนค่าที่สร้างขึ้นข้อมูลที่ทำเครื่องหมายว่าสร้างเสร็จแล้วจะต้องเป็นแบบไม่แทรกและไม่สามารถอัพเดตได้ timestamps และคุณสมบัติแบบเรียบง่ายเท่านั้น ทำเครื่องหมายว่าเป็นค่าที่สร้างขึ้นแม้ว่าค่าดีฟอลต์ที่ระบุจะไม่ถูกสร้างขึ้นภายในฐานข้อมูลค่าที่กำหนดจะถูกสร้างขึ้นในการแทรก แต่ไม่ได้เกิดขึ้นใหม่ในการปรับปรุงที่ตามมาคุณสมบัติเช่นวันที่สร้างไว้ตกอยู่ในหมวดหมู่นี้แม้ว่าจะมีรุ่นและคุณสมบัติ timestamp ก็ตาม สามารถทำเครื่องหมายเป็นสร้างตัวเลือกนี้ไม่ได้ available. always the property value is generated both on insert and on update.5 7 Auxiliary database objects. Auxiliary database objects allow for the CREATE and DROP of arbitrary database objects In conjunction with Hibernate s schema evolution tools, they have the ability to fully define a user schema within the Hibernate mapping files Although designed specifically for creating and dropping things like triggers or stored procedures, any SQL command that can be run via a method is valid for example, ALTERs, INSERTS, etc There are essentially two modes for defining auxiliary database objects. The first mode is to explicitly list the CREATE and DROP commands in the mapping file. The second mode is to supply a custom class that constructs the CREATE and DROP commands This custom class must implement the interface. Additionally, these database objects can be optionally scoped so that they only apply when certain dialects are used. Copyright 2004 Red Hat Middleware, LLC. private contents. Input Stream contents i m getting these from a file Blob b. Now when I save the Blob b, when there is a flush, it executes code that apparently is trying to convert the Blob into a byte , so I get an OutOfMemoryError Here. Java heap space at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at. Here is the method unwrap in BlobTypeDescriptor where the exception is getting thrown. SuppressWarnings public X X unwrap Blob value, Class X type, WrapperOptions options if type type throw unknownUnwrap type. if value null return null. if type try return X new BinaryStreamImpl catch SQLException e throw new HibernateException Unable to access blob stream , e. final Blob blob value WrappedBlob value value return X blob. This is the line throwing the exception. return X new BinaryStreamImpl. It is trying to change everything into a byte , and then back into BinaryStreamImpl. Is there a way I can somehow tell hibernate not to put everything into a byte like this. I ran into the same issue OOM , and fixed it by replacing the BlobTypeDescriptor. SuppressWarnings unchecked Override public X X unwrap Blob value, Class X type, WrapperOptions options if value null return null. if type return X new BinaryStreamWrapper value. try final Blob blob value WrappedBlob value value final Blob rv return X rv catch SQLException e throw new HibernateException e. BinaryStreamWrapper implements BinaryStream and wraps around a Blob without using byte-arrays. You can register this new BlobType using an Integrator. public class BlobIntegrator implements Integrator Override public void integrate Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry BlobUserType blobUserType new BlobUserType. Another alternative is to register a UserType which overrides the nullSafeGet and nullSafeSet, but remember that you will need to handle the gory details of creating a Blob e g Oracle requires so you need to use a LobCreator Also you would need to specify the UserType for each property. Lob Type type BobUserType private Blob contents.
No comments:
Post a Comment