ฉันมีแอปพลิเคชันที่ใช้คำอธิบายประกอบไฮเบอร์เนต 3.1 และ JPA มีออบเจ็กต์สองสามรายการที่มีแอตทริบิวต์ไบต์ [] (ขนาด 1k - 200k) มันใช้คำอธิบายประกอบ JPA @Lob และ hibernate 3.1 สามารถอ่านสิ่งเหล่านี้ได้ดีในฐานข้อมูลหลักทั้งหมด - ดูเหมือนว่าจะซ่อนลักษณะเฉพาะของผู้ขาย JDBC Blob (ตามที่ควรทำ)
@Entity
public class ConfigAttribute {
@Lob
public byte[] getValueBuffer() {
return m_valueBuffer;
}
}
เราต้องอัปเกรดเป็น 3.5 เมื่อเราพบว่าไฮเบอร์เนต 3.5 หยุดพัก (และจะไม่แก้ไข)ชุดคำอธิบายประกอบนี้ใน postgresql (โดยไม่มีวิธีแก้ปัญหา) ฉันยังไม่พบการแก้ไขที่ชัดเจน แต่ฉันสังเกตเห็นว่าถ้าฉันเพิ่งลบ @Lob ออกมันจะใช้ไบต์ประเภท postgresql (ซึ่งใช้ได้ แต่เฉพาะใน postgres)
annotation postgres oracle works on
-------------------------------------------------------------
byte[] + @Lob oid blob oracle
byte[] bytea raw(255) postgresql
byte[] + @Type(PBA) oid blob oracle
byte[] + @Type(BT) bytea blob postgresql
once you use @Type, @Lob seems to not be relevant
note: oracle seems to have deprecated the "raw" type since 8i.
ฉันกำลังมองหาวิธีที่จะมีคลาสคำอธิบายประกอบเดียว (ที่มีคุณสมบัติหยด) ซึ่งสามารถพกพาได้ในฐานข้อมูลหลัก ๆ
- วิธีแบบพกพาในการใส่คำอธิบายประกอบคุณสมบัติไบต์ [] คืออะไร?
- สิ่งนี้ได้รับการแก้ไขในโหมดไฮเบอร์เนตเวอร์ชันล่าสุดหรือไม่
อัปเดต: หลังจากอ่านบล็อกนี้ในที่สุดฉันก็พบว่าวิธีแก้ปัญหาดั้งเดิมในปัญหา JIRA คืออะไร: เห็นได้ชัดว่าคุณควรวาง @Lob และใส่คำอธิบายประกอบคุณสมบัติเป็น:
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
byte[] getValueBuffer() {...
อย่างไรก็ตามสิ่งนี้ใช้ไม่ได้สำหรับฉัน - ฉันยังคงได้รับ OIDs แทน bytea อย่างไรก็ตามมันใช้งานได้กับผู้เขียนปัญหา JIRA ซึ่งดูเหมือนจะต้องการ oid
หลังจากคำตอบจากอ.
@Type(type="org.hibernate.type.BinaryType")
byte[] getValueBuffer() {...
สิ่งที่ต้องทำจริงๆคือควบคุม @ org.hibernate.annotations อันไหนพิมพ์ชุดค่าผสม (@Lob + byte [] ได้รับการแมป) เป็น (บน postgresql)
นี่คือตัวอย่างจาก 3.5.5 สุดท้ายจาก MaterializedBlobType (sql type Blob) ตามบล็อกของ Steve postgresql ต้องการให้คุณใช้ Streams สำหรับ bytea (อย่าถามฉันว่าทำไม) และประเภท Blob ที่กำหนดเองของ postgresql สำหรับ oids โปรดทราบด้วยว่าการใช้ setBytes () บน JDBC นั้นใช้สำหรับ bytea (จากประสบการณ์ที่ผ่านมา) ดังนั้นสิ่งนี้จึงอธิบายได้ว่าเหตุใด use-stream จึงไม่มีผลต่อทั้งคู่ถือว่าเป็น 'bytea'
public void set(PreparedStatement st, Object value, int index) {
byte[] internalValue = toInternalFormat( value );
if ( Environment.useStreamsForBinary() ) {
// use streams = true
st.setBinaryStream( index,
new ByteArrayInputStream( internalValue ), internalValue.length );
}
else {
// use streams = false
st.setBytes( index, internalValue );
}
}
ผลลัพธ์นี้ใน:
ERROR: column "signature" is of type oid but expression is of type bytea
อัปเดต คำถามเชิงตรรกะต่อไปคือ: "ทำไมไม่เปลี่ยนคำจำกัดความของตารางด้วยตนเองเป็น bytea" และเก็บ (@Lob + byte []) ไว้ นี้ไม่ทำงานจนกว่าคุณพยายามที่จะเก็บไบต์โมฆะ [] ซึ่งไดรเวอร์ postgreSQL คิดว่าเป็นนิพจน์ประเภท OID และประเภทคอลัมน์เป็น bytea - นี่เป็นเพราะ hibernate (ถูกต้อง) เรียกใช้ JDBC.setNull () แทน JDBC.setBytes (null) ซึ่งไดรเวอร์ PG คาดหวัง
ERROR: column "signature" is of type bytea but expression is of type oid
ขณะนี้ระบบประเภทอยู่ในโหมดไฮเบอร์เนตเป็น "งานที่อยู่ระหว่างดำเนินการ" (ตามความคิดเห็นเกี่ยวกับการเลิกใช้งาน 3.5.5) ในความเป็นจริงแล้วโค้ด 3.5.5 จำนวนมากเลิกใช้งานแล้วจึงยากที่จะทราบว่าจะต้องดูอะไรเมื่อจัดคลาสย่อยของ PostgreSQLDialect)
AFAKT, types.BLOB / 'oid' บน postgresql ควรแมปกับประเภทที่กำหนดเองบางประเภทซึ่งใช้การเข้าถึง JDBC สไตล์ OID (เช่นวัตถุ PostgresqlBlobType และไม่ใช่ MaterializedBlobType) ฉันไม่เคยใช้ Blobs กับ postgresql ได้สำเร็จเลย แต่ฉันรู้ว่า bytea ใช้งานได้ตามที่ฉันคาดหวัง
ขณะนี้ฉันกำลังดู BatchUpdateException - อาจเป็นไปได้ว่าไดรเวอร์ไม่รองรับการทำแบตช์
คำพูดที่ยอดเยี่ยมจากปี 2004: "เพื่อสรุปความวุ่นวายของฉันฉันบอกว่าพวกเขาควรรอให้ไดรเวอร์ JDBC ทำการ LOB อย่างถูกต้องก่อนที่จะเปลี่ยน Hibernate"
อ้างอิง:
- https://forum.hibernate.org/viewtopic.php?p=2393203
- https://forum.hibernate.org/viewtopic.php?p=2435174
- http://hibernate.atlassian.net/browse/HHH-4617
- http://postgresql.1045698.n5.nabble.com/Migration-to-Hibernate-3-5-final-td2175339.html
- https://jira.springframework.org/browse/SPR-2318
- https://forums.hibernate.org/viewtopic.php?p=2203382&sid=b526a17d9cf60a80f13d40cf8082aafd
- http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/